我正在开发一个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参数一样。
答案 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
[...]