我正在一个项目中对我的一些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文件