当__init__.py存在时,带有安装程序的Python构建cython扩展会创建子文件夹

Hol*_*olt 5 python cython setup.py

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

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("verifier_c.pyx"),
)
Run Code Online (Sandbox Code Playgroud)

我具有以下文件夹结构:

.
c_ext/
  __init__.py
  verifier_c.pyx
  setup.py
Run Code Online (Sandbox Code Playgroud)

如果我运行以下命令:

python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

我得到一个额外的c_ext子文件夹,如下所示:

.
c_ext/
  build/
    ...
  c_ext/
    verifier_c.so
  __init__.py
  verifier_c.pyx
  setup.py
Run Code Online (Sandbox Code Playgroud)

但是,如果删除该__init__.py文件,则该verifier_c.so文件将与存放在同一文件夹中verifier_c.pyx

我没有找到记录此行为的位置,但是我想保留verifier_c.so在与该文件夹相同的文件夹中,verifier_c.pyx而不必__init__.py每次运行时都删除它setup.py。我该如何实现?

m00*_*0am 4

正如评论中提到的,setup.py不应存在于您的包内。据我所知, build_ext 命令没有选项(除了--inplace)来指定目标路径。您可以在此处找到一些文档。这个问题也涉及类似的主题。

为了适应所需的包结构,您的包必须如下所示:

c_ext/
    setup.py
    myfile.py
    verifier/
        __init__.py
        verifier_c.pyx
Run Code Online (Sandbox Code Playgroud)

您将获得位于验证程序包中的扩展:

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
Run Code Online (Sandbox Code Playgroud)

然后您可以从验证程序包中导入verifier_c。例如,从myfile.py这个看起来像:

from verifier import verifier_c
...
Run Code Online (Sandbox Code Playgroud)

您可以为每个 Cython 扩展管理一个单独的包(和文件夹),或者创建一个包含所有扩展的子文件夹。cythonize您还必须传递其他模块。它可以处理glob 模式、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),
)
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助:)