在pip包构建上编译Cython

时间:2015-08-06 03:21:53

标签: python pip cython

我正在开发一个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 DOES生成.so文件。如何使用pip生成.so文件?我试图通过阅读他们的代码来弄清楚statsmodel是如何做到的,但老实说,这对我来说是一个谜。

几乎就像pip命令错过了build_ext参数一样。

2 个答案:

答案 0 :(得分:2)

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

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

正在使用PyPI中的旧版本,该版本没有带有Cython代码的新setup.py。当我正确地做到了

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

并在我的硬盘上使用了最新版本,它工作正常。

小胜利。

答案 1 :(得分:0)

我来这里是因为我不确定安装我的软件包的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
  [...]