将不同名称的cythonize python模块打包到不同的软件包中

问题描述 投票:1回答:1

我正在对一个项目中的某些python模块进行cythonization。

python 3.7。*Ubuntu(不同版本取决于Docker映像和开发环境)Cython == 0.29.14

我遇到一个问题,如果我在不同的软件包中具有相同名称的模块,它们都将被编译为.c,但是其中只有一个被编译为生成的.so文件。 .so文件在当前目录中生成,而不是在源文件旁边的--inplace生成。

文件夹结构:

    .  
    ├── my_pkg  
    │   ├── training  
    │   │   └── util.py  
    │   └── validation  
    │       └── util.py  
    └── compile.py  

compile.py看起来像这样:

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

ext_modules = [
    Extension("*",
        ["./my_pgk/*/*.py"]
    )
]

setup(
    name="my_project",
    ext_modules=cythonize(
        ext_modules,
        compiler_directives={'language_level' : "3"}),
)

执行:

python compile.py build_ext --inplace

编辑:查看命令日志(的一部分),我注意到对于一个模块,.so文件实际上是生成的,而不是在源python&c文件旁边“ --inplace”,而是在当前目录中。尝试了两个以上的模块,实际上除了最后一个模块外,所有其他模块都正确放置了.so,但对于最后一个模块,它位于当前目录中。

输出:

building 'my_pgk.training.utils' extension
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.7/./src/app/training/utils.o -o ./my_pgk/training/utils.cpython-37m-x86_64-linux-gnu.so

building 'utils' extension
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.7/./my_pgk/validation/utils.o -o ./utils.cpython-37m-x86_64-linux-gnu.so

运行后的文件夹结构:

    .  
    ├── my_pkg  
    │   ├── training  
    │   │   ├── util.py
    │   │   ├── util.c
    │   │   └── utils.cpython-37m-x86_64-linux-gnu.so
    │   └── validation  
    │       ├── util.py
    │       └── util.c  
    ├── compile.py  
EDIT└── utils.cpython-37m-x86_64-linux-gnu.so // this is misplaced

这将在原始.py文件旁边生成一个.c和.so文件,除非当模块具有相同名称时,即使它们位于不同的程序包中。

显然,我希望所有.py文件都具有.so文件

我尝试在ext_modules列表中通过名称而不是glob显式列出它们,但是也没有这样做。

目前,我最终要做的是运行使用不包含重复模块名称的不同ext_module列表进行多次cythonize,>使用指定的目标位置分别指定模块,但这是不可持续的。

我应该如何指定我的模块和/或应该包括哪些选项来一次运行生成所有.so文件?我想我在犯错,因为在所有(子)包中都不需要全局模块名唯一性,因此应该是受支持的用例。

我正在对一个项目中的某些python模块进行cythonization。 python 3.7。* Ubuntu(不同版本,具体取决于docker映像和开发环境)Cython == 0.29.14我遇到了问题...

python cython setup.py distutils
1个回答
0
投票

[在github上的cython仓库中查看cythonize的代码,我意识到发生了什么。

© www.soinside.com 2019 - 2024. All rights reserved.