微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试在setup.py中指定的同一软件包中安装Python扩展模块Cython时使用ModuleNotFound

如何解决尝试在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 举报,一经查实,本站将立刻删除。