使用Cython构建的Buildout
我在使用buildout的时候遇到了cython的问题。
其中一个部分是用cython从一个.c
文件和一个.pyx
文件构建的模块。
我已经尝试了很多解决方案:
但最后都出现了错误:
ImportError: No module named Cython.Distutils
这个错误发生在buildout加载这个cython模块的setup.py
文件的时候。
需要注意的是,当从它自己的目录调用setup.py
并且使用buildout的bin目录中的解释器时,它是可以正常工作的。
谢谢你的帮助。
3 个回答
这个操作不能一步到位,但可以通过两个步骤轻松完成。
使用:
python bootstrap.py
./bin/buildout install cython
./bin/cpy bootstrap.py
./bin/cpy ./bin/buildout
之所以可以这样做,是因为buildout支持一个不太为人知的选项'install',虽然没人提起过,但你可以这样使用它:
[buildout]
parts = deps py # <---- Notice we don't depend on cython here
eggs =
whatever
kdist
nark
kivy # <--- But we do have a module that requires cython to build
develop =
.
lib/nark
lib/kivy-dist
[cython] # <---- By calling ./bin/buildout install cython we trigger this
recipe = zc.recipe.egg:script
parts = cython-py
interpreter = cpy # <--- Which makes our dummy ./bin/cpy
eggs =
cython
pyinstaller
[deps]
recipe = zc.recipe.egg:eggs
eggs = ${buildout:eggs}
[py]
recipe = zc.recipe.egg:script
interpreter = py
eggs = ${buildout:eggs}
这个方法的妙处在于,第二次运行buildout时会清空bin目录,所以最后你会得到一个看起来像这样的bin目录:
$ ls bin/
buildout garden py
没有多余的包留在你的虚拟环境中,避免后面出现问题。这也是我们一开始使用buildout的原因,对吧?
...当然,如果你希望cython保留在那儿,只需把它放在最上面的依赖项中即可。
我今天发现了这个解决方案:https://pypi.python.org/pypi/mr.cython/1.0,它可以解决这个问题。
这个解决方案通过安装一个扩展的配方来安装cython,这样在运行 setup.py develop
时就可以使用它了。
问题在于,想要构建一个cython模块,但系统级别并没有安装cython。
你链接的文章告诉你如何通过 buildout 安装 Cython,但要做到这一点,你需要对 site-packages
文件夹有写入权限。你可以通过三种方式来运行这些 buildout:
以管理员身份运行,并将 Cython 安装到系统的 Python 的
site-packages
中。通常情况下,你应该尽量避免这样做。自己编译一个 Python。如果你想使用系统中没有的 Python 版本,这可能是唯一的选择。有一些 buildout 配置可以让你在 buildout 内部编译任何版本的 Python。
使用
virtualenv
。这会在 buildout 文件夹中创建一个完整的 Python 虚拟环境,包括你自己的site-packages
文件夹。这通常是运行可以使用系统 Python(或你已经全局安装的其他 Python)的 buildout 的最佳方式。
我建议你把使用 virtualenv
作为你软件安装说明的一部分。