1

问题

我有一个看起来像这样的项目结构:

\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)时,我的轮子文件具有以下结构:

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

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

可能的原因

稍微调查一下,问题似乎出在从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
    (...)
)

这是某种预期的行为还是我做错了什么?这可能是什么原因造成的?现在这个解决方法可以,但我想知道解决这个问题的正确方法。

谢谢!

4

2 回答 2

1

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

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

并将其添加到我的setup.py

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

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

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

于 2018-04-21T23:46:34.667 回答
0

看看这个:https ://groups.google.com/g/cython-users/c/d-3Clm2EkHs

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

于 2020-09-22T21:34:37.507 回答