在不同的包中使用相同的名称对python模块进行Cythonize

在不同的包中使用相同的名称对python模块进行Cythonize,python,cython,setup.py,distutils,Python,Cython,Setup.py,Distutils,我正在对项目中的一些python模块进行Cythonization python 3.7.* Ubuntu(根据docker映像和开发环境的不同版本) Cython==0.29.14 我遇到了一个问题,如果在不同的包中有同名的模块,所有模块都会被传输到.c,但只有一个模块会被编译成.so文件。对于其中一个,将在当前目录中生成.so文件,而不是在源文件旁边的--inplace中生成 文件夹结构: . ├── my_pkg │ ├── training

我正在对项目中的一些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如下所示:

来自distutils.core导入设置
从Cython.Build导入cythonize
从distutils.extension导入扩展
外部模块=[
扩展名(“*”,
[“/my_pgk/*/*.py”]
)
]
设置(
name=“我的项目”,
ext_模块=cythonize(
外部模块,
编译器_指令={'language_level':“3”}),
)
执行:

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

输出:

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_模块列表中以名称而不是glob显式地列出它们,但也没有做到这一点

现在,我要做的是使用不同的ext_模块列表多次运行cythonize,这些列表中不包含重复的模块名称,使用预期的目标位置分别指定模块,但这是不可持续的


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

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

基本上,如果使用了--inplace标志,并且模块的目标位置/名称未被识别为包,即包含
\uuuu init\uuuuuuuuuuuy.py[c | x | d]
文件的文件夹,那么cythonize将沿着提供的目标路径字符串走,直到找到包或路径“耗尽”在这种情况下,它只是将生成的文件保存在当前目录中

事实上,在一个特定的包中,我丢失了一个
\uuuu init\uuuuu.py
文件,这就是.So被“放错地方”的原因。我只是没有意识到失败的总是同一个模块

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