如何解决尝试在setup.py中指定的同一软件包中安装Python扩展模块Cython时使用ModuleNotFound
我为要安装到与项目相同的名称空间的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
目录中的软件包。由于它们具有相同的文件夹结构,因此选择了本地目录作为取代的导入包。
从不同于源的文件夹中进行测试/运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。