我正在开发一个Python包EcoPy,它主要是用纯Python编写的。主文件夹称为ecopy。有一个叫做regression的子文件夹,里面有一个已经构建好的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文件?我试图通过阅读statmodels的代码来弄清楚它是如何做到的,但老实说,这对我来说是个谜。
就好像pip命令忽略了build_ext参数。
我可以回答这个问题,因为我刚刚知道我是个白痴。
sudo pip install ecopy -e . --upgrade --force-reinstall
使用的是PyPI的旧版本,没有新的setup.py和Cython代码。当我做对了
sudo pip install -e . --upgrade --force-reinstall
并在我的硬盘上使用最新的版本,它工作得很好。
小胜利。
我来这里是因为我不确定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
[...]