【问题标题】:Compile Cython on pip package build在 pip 包构建上编译 Cython
【发布时间】:2015-08-06 03:21:52
【问题描述】:

我正在开发一个 Python 包,EcoPy,它主要是用纯 Python 编写的。主文件夹称为 ecopy。有一个名为回归的子文件夹,其中包含一个已经构建的 Cython 文件。主 setup.py 文件包含代码:

ext_modules = cythonize([
    Extension(
        'ecopy.regression.isoFunc', ['ecopy/regression/isoFunc.pyx'], **opts),
])

当我跑步时

sudo pip install ecopy -e . --upgrade --force-reinstall

模块构建良好。如果我删除了 isoFunc.c 文件,它甚至会重新编译它。问题是 Cython 不会将 .c 文件转换为 .so 文件,我需要它来导入函数。如果我尝试在没有它的情况下加载模块,我会得到

ImportError: No module named isoFunc

如果我使用命令行手动设置文件

python setup.py build_ext --inplace

Cython 会生成 .so 文件。如何让它使用 pip 生成 .so 文件?我试图通过阅读他们的代码来弄清楚 statsmodels 是如何做到的,但老实说,这对我来说是个谜。

就好像 pip 命令遗漏了 build_ext 参数一样。

【问题讨论】:

    标签: python pip cython


    【解决方案1】:

    我可以回答这个问题,因为我才知道我是个白痴。

    sudo pip install ecopy -e . --upgrade --force-reinstall
    

    使用的是 PyPI 的旧版本,它没有带有 Cython 代码的新 setup.py。当我做对了

    sudo pip install -e . --upgrade --force-reinstall
    

    并在我的硬盘上使用了最新版本,它运行良好。

    小小的胜利。

    【讨论】:

      【解决方案2】:

      我来到这里是因为我不确定 pip 安装我的包是否足以自动编译 Cython 源代码。看起来确实如此,但默认情况下 pip 输出似乎没有记录。我注意到pip install -e . -v 非常清楚地说明了编译和链接步骤是否/具体做了什么:

      Running setup.py develop for mypackage
        [...]
        running build_ext
        cythoning mypackage/my_cython_module.pyx to mypackage/my_cython_module.c
        building 'mypackage.my_cython_module' extension
        x86_64-linux-gnu-gcc [...] -c mypackage/my_cython_module.c -o build/temp.linux-x86_64-2.7/mypackage/my_cython_module.o
        x86_64-linux-gnu-gcc [...] build/temp.linux-x86_64-2.7/mypackage/my_cython_module.o -o build/lib.linux-x86_64-2.7/mypackage/my_cython_module.so
        copying build/lib.linux-x86_64-2.7/mypackage/my_cython_module.so -> mypackage
        [...]
      

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 2021-04-22
        • 1970-01-01
        • 2011-09-10
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多