我有一个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
目录中的软件包。由于它们具有相同的文件夹结构,因此选择了本地目录作为取代的导入包。
从不同于源的文件夹进行测试/运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句