【问题标题】:Cythonize function includes root folder in extension nameCythonize 函数在扩展名中包含根文件夹
【发布时间】:2018-04-21 11:22:22
【问题描述】:

问题

我的项目结构如下所示:

\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)

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

可能的原因

调查了一下,似乎问题出在cythonize()函数生成的扩展名上,它们都以t_src开头,比如:

t_src.mylib.module1

解决方法

如果我实际上在setup() 函数之前运行cythonize() 函数并手动从扩展名中删除"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
    (...)
)

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

谢谢!

【问题讨论】:

    标签: cython cythonize


    【解决方案1】:

    我基本上把我的项目结构改成:

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

    并将其添加到我的setup.py

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-03-24
        • 2017-12-15
        • 2019-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多