当__init__.py存在时,使用setup构建cython扩展的Python会创建子文件夹

时间:2016-01-07 10:40:23

标签: python cython setup.py

我正在尝试使用以下cython编译一个简单的setup.py模块:

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.soverifier_c.pyx保持在同一文件夹中,但每次运行{{}}时都不必删除__init__.py 1}}。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,setup.py不应该存在于您的包中。据我所知,build_ext命令没有选项(除了--inplace)来指定目标路径。您可以找到一些文档herethis 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),
)

我希望这有帮助:)