在pip包上编译Cython



我正在开发一个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
  [...]

相关内容

  • 没有找到相关文章

最新更新