将具有相同名称的python模块在不同的包下进行Cythonze



我正在一个项目中对我的一些python模块进行细胞计数。

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

我遇到了一个问题,如果我在不同的包中有相同名称的模块,所有模块都会被转换到.c,但只有一个模块会使用生成的.so文件进行编译对于其中一个,.so文件是在当前目录中生成的,而不是在源文件旁边的位置。

文件夹结构:

.  
├── 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文件,而是在当前目录中。用两个以上的模块进行了尝试,事实上,除了最后一个模块外,其他模块都正确放置了.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文件?我想我做错了什么,因为在所有(子(包中没有全局模块名称唯一性的要求,所以它应该是一个受支持的用例。

在github上的cython repo中查看cythonze的代码,我意识到发生了什么。

基本上,如果使用了--inplace标志,并且模块的目标位置/名称未被识别为包,即包含__init__.py[c|x|d]文件的文件夹,那么cythosize将遍历所提供的目标路径字符串,直到它找到一个包,或者直到路径"用尽",在这种情况下,它只将生成的文件保存在当前目录中。

事实上,在一个特定的包中,我丢失了一个__init__.py文件,这就是.So被"放错地方"的原因。我只是没有意识到总是同一个模块出了故障。

我上面提供的简化示例没有反映实际情况,因为中没有init文件

最新更新