Cythonize函数包括扩展名中的根文件夹

时间:2018-04-21 11:22:22

标签: cython cythonize

问题

我的项目结构如下:

\t_src
    \mylib
        __init__.py
        module.pyx
        (... other .py sources)
setup.py
(other non .py files)

我的setup.py使用cythonize来编译.pyx文件:

setup(
    (...)
    ext_modules=cythonize(['mylib/**/*.pyx'])
    (...)
)

它主要起作用但是当我创建一个二进制轮(使用python setup.py build_ext bdist_wheel clean --all)时,我的wheel文件具有以下结构:

\mylib
    (all python modules)
\t_src
    \mylib
        (compiled cython modules)

哪个不好,因为我希望编译的cython模块也在mylib根文件夹中。

可能的原因

稍微调查一下,问题出现在cythonize()函数生成的扩展名上,所有扩展名都以t_src开头,如:

t_src.mylib.module1

解决方法

如果我实际在cythonize()函数之前运行setup()函数并从扩展名中手动删除"t_src."字符串,那么我的方向盘上的所有内容都按预期mylib

ext_modules=cythonize(['mylib/**/*.pyx'])

for module in ext_modules:
    module.name = module.name.replace("t_src.","")

setup(
    (...)
    ext_modules=ext_modules
    (...)
)

这种预期的行为是某种方式还是我做错了什么?可能是什么导致了这个?目前这种解决方法可以,但我想知道正确的解决方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

我基本上将项目的结构更改为:

\t_src
    \src
        \mylib
            (files)
    \tests
        (files)
    setup.py
    (other files)

并将其添加到我的setup.py

packages=find_packages('src'),
package_dir={'': 'src'},

然后我没有更多的问题,cythonized模块和其他python文件一起放在mylib文件夹中,就像它应该的那样。

在我意识到我的测试使用当前文件夹上的代码而不是已安装的软件包后,我实际上更改了布局。幸运的是,我也解决了这个问题所说的问题。

答案 1 :(得分:0)

签出:https://groups.google.com/g/cython-users/c/d-3Clm2EkHs

就像您的根目录包含__init__.py。这使其成为python模块。删除该文件应该可以解决您的问题。