【问题标题】:Python building cython extension with setup creates subfolder when __init__.py exists当 __init__.py 存在时,使用 setup 构建 cython 扩展的 Python 会创建子文件夹
【发布时间】:2016-04-11 17:15:48
【问题描述】:

我正在尝试使用以下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.pyx 相同的文件夹中获得 verifier_c.so 文件。

我没有找到记录此行为的位置,但我想将 verifier_c.so 保留在与 verifier_c.pyx 相同的文件夹中,但不必在每次运行 setup.py 时删除 __init__.py。我怎样才能做到这一点?

【问题讨论】:

  • setup.py 位于错误的文件夹中。将其上移一级并相应地更改cythonize() 的参数。然后.so 文件应该显示在已经存在的c_ext/ 文件夹中(如果存在__init__.py 文件,则它是一个包。
  • @BlackJack 不能将setup.py.pyx 文件放在同一个文件夹中并在此文件夹中生成.so 吗?我想将c 部分与我的应用程序的其余部分完全分开(因此不要将setup.py 放在基本应用程序中)。
  • 我不知道这是否可能,但在那个位置使用setup.py 是错误的。它是您组织它的方式的包的一部分。这种方式有一个c_ext.setup 模块,这是没有意义的。

标签: python cython setup.py


【解决方案1】:

如 cmets 中所述,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),
)

希望对你有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多