尝试在 setup.py 中指定的同一包内安装 Python 扩展模块 (Cython) 时发现 ModuleNotFound
ModuleNotFound when trying to install Python Extension Module (Cython) inside the same package specified in setup.py
我有一个 Python 项目的 Cython 扩展模块,我想安装到与安装项目相同的名称空间。当我尝试在扩展中指定将其安装在包本身内时,无法找到和导入它。如果我指定扩展进入 Python 命名空间的根目录,它工作正常,但它不在我想要的模块命名空间中。如何让扩展模块可以从与包本身相同的名称空间导入?
这个问题我做了一个简单的测试用例。
文件夹结构:
mypkg
├── foo
│ ├── __init__.py
│ └── barCy.pyx
└── setup.py
.barCy.pyx
文件:
cpdef long bar():
return 0
setup.py
代码:
import distutils.extension
from Cython.Build import cythonize
from setuptools import setup, find_packages
extensions = [distutils.extension.Extension("foo.bar",
['foo/barCy.pyx'])]
setup(
name='foo',
packages=find_packages(),
ext_modules=cythonize(extensions),
)
__init.py__
为空。
我希望能够做到:
>>> import foo.bar as bar
>>> bar.bar()
0
相反,我得到
>>> import foo.bar as bar
ModuleNotFoundError: No module named 'foo.bar'
如果我将 Extension("foo.bar",...
更改为 Extension("bar",...
,那么我可以将 import bar
当作顶级包。虽然这是预期的行为,但这不是我想要的,因为我只希望可以通过 foo
命名空间访问此扩展模块。
我的 Python 解释器 运行 来自与 setup.py
脚本相同的文件夹,所以 import foo
是导入本地包,而不是安装的包在 Python 解释器的 site-packages
目录中。由于它们具有相同的文件夹结构,因此选择本地目录作为替代导入包。
从不同于源文件夹的文件夹中执行 testing/running。
我有一个 Python 项目的 Cython 扩展模块,我想安装到与安装项目相同的名称空间。当我尝试在扩展中指定将其安装在包本身内时,无法找到和导入它。如果我指定扩展进入 Python 命名空间的根目录,它工作正常,但它不在我想要的模块命名空间中。如何让扩展模块可以从与包本身相同的名称空间导入?
这个问题我做了一个简单的测试用例。
文件夹结构:
mypkg
├── foo
│ ├── __init__.py
│ └── barCy.pyx
└── setup.py
.barCy.pyx
文件:
cpdef long bar():
return 0
setup.py
代码:
import distutils.extension
from Cython.Build import cythonize
from setuptools import setup, find_packages
extensions = [distutils.extension.Extension("foo.bar",
['foo/barCy.pyx'])]
setup(
name='foo',
packages=find_packages(),
ext_modules=cythonize(extensions),
)
__init.py__
为空。
我希望能够做到:
>>> import foo.bar as bar
>>> bar.bar()
0
相反,我得到
>>> import foo.bar as bar
ModuleNotFoundError: No module named 'foo.bar'
如果我将 Extension("foo.bar",...
更改为 Extension("bar",...
,那么我可以将 import bar
当作顶级包。虽然这是预期的行为,但这不是我想要的,因为我只希望可以通过 foo
命名空间访问此扩展模块。
我的 Python 解释器 运行 来自与 setup.py
脚本相同的文件夹,所以 import foo
是导入本地包,而不是安装的包在 Python 解释器的 site-packages
目录中。由于它们具有相同的文件夹结构,因此选择本地目录作为替代导入包。
从不同于源文件夹的文件夹中执行 testing/running。