当__init__.py存在时,使用setup构建cython扩展的Python会创建子文件夹
作者:互联网
我正在尝试使用以下setup.py编译一个简单的cython模块:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("verifier_c.pyx"),
)
我有以下文件夹结构:
.
c_ext/
__init__.py
verifier_c.pyx
setup.py
如果我运行以下内容:
python setup.py build_ext --inplace
我得到一个额外的c_ext子文件夹,如下所示:
.
c_ext/
build/
...
c_ext/
verifier_c.so
__init__.py
verifier_c.pyx
setup.py
但是如果删除__init__.py文件,我会将verifier_c.so文件放在与verifier_c.pyx相同的文件夹中.
我没有找到记录此行为的位置,但我想将verifier_c.so保存在与verifier_c.pyx相同的文件夹中,但每次运行setup.py时都不必删除__init__.py.我怎样才能做到这一点?
解决方法:
正如评论中所提到的,setup.py不应该存在于您的包中.据我所知,build_ext命令没有选项(除了–inplace)以指定目标路径.您可以找到一些文档here.此外,this question也涉及类似的主题.
要适应所需的包结构,您的包必须如下所示:
c_ext/
setup.py
myfile.py
verifier/
__init__.py
verifier_c.pyx
您将获得一个存在于验证程序包中的扩展程序:
me@machine:~/c_ext/$python setup.py build_ext --inplace
c_ext/
setup.py
myfile.py
verifier/
__init__.py
verifier_c.pyx
verifier_c.so
然后,您可以从验证程序包导入verifier_c.例如,从myfile.py看起来像:
from verifier import verifier_c
...
您可以为每个Cython扩展管理单独的包(和文件夹),或者创建一个包含所有这些扩展的子文件夹.您还必须将其他模块传递给cythonize.它可以处理glob pattern,glob模式列表或Distutils.Extensions对象列表.后者可以方便地指定cython编译器指令
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
extensions = [
Extension("verifier_c", ["verifier/verifier_c.pyx"]),
Extension("something_else", ["foobar/something_else.pyx"] compiler_directives={'embedsignature': True}),
]
setup(
ext_modules=cythonize(extensions),
)
我希望这有帮助:)
标签:python,cython,setup-py 来源: https://codeday.me/bug/20190706/1397150.html