使用Cython构建部分的Buildout

5

我在使用buildout过程中遇到了cython的问题。

其中一个部分是使用cython从.c文件和.pyx文件构建的模块。

我已经尝试了许多解决方案:

但所有的尝试都以错误结束:

ImportError: No module named Cython.Distutils

当buildout加载这个cython模块的setup.py时,会发生这种情况。

请注意,当从其自己的目录和使用buildout bin目录中的解释器调用setup.py时,它是可用的。

感谢您的帮助。


你确定已经正确安装了Cython,并且设置了PYTHONPATH环境变量以包含Cython模块所在的目录吗? - Fred Foo
你的意思是在系统级别上吗?这将使得此构建无法在没有Cython的系统上部署...? - Benoît Laurent
“system level” 是什么意思? - Fred Foo
我的意思是安装在site-package中。感谢关注我的问题。 - Benoît Laurent
你需要在某个地方安装它,可以是/usr/local/lib/python2.X/site-packages,也可以是你的主目录。如果是后者,必须正确设置PYTHONPATH - Fred Foo
3个回答

4
您提供的文章告诉您如何从buildout安装Cython,但是要这样做,您需要对site-packages文件夹具有写访问权限。以下是三种运行buildouts的方法:
  1. 以root用户身份运行并将Cython安装到系统python的site-packages中。通常情况下,您应该避免这样做。

  2. 编译自己的Python。如果您想使用尚未在系统上安装的Python版本,则可能只有这个选项。有一些buildout配置可以让您从内部构建任何版本的Python。

  3. 使用virtualenv。这将在buildout文件夹中创建一个完整的Python虚拟环境,包括您自己的site-packages文件夹。这通常是运行可以使用系统Python(或您已经全局安装的任何其他Python)的buildout的最佳方法。

我建议您将使用virtualenv作为软件安装说明的一部分。

谢谢您的建议,我会深入研究这个方向。 - Benoît Laurent

2
我今天发现了这个解决方案:https://pypi.python.org/pypi/mr.cython/1.0。这个方案通过使用一个扩展安装包来安装cython,这样当运行setup.py develop时就可以使用它了。
问题是在没有系统级安装cython的情况下构建cython模块。

答案看起来对我来说很好。 OP正在回答自己的问题,并提供相关的解决方案和上下文。 - Håken Lid
OP数年后回来为问题提供答案,这符合StackOverflow的精神,并值得点赞。请参阅相关的XKCD漫画:https://xkcd.com/979/。 - Håken Lid
@HåkenLid:说得好,我也点了赞。 @ OP: 你也可以接受你的答案 :-) - Ida

1

这不能一步完成,但是可以分为两个步骤轻松完成。

使用:

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保持存在,只需将其放入顶部的依赖项中即可。

太棒了,我不知道那个参数,它是我一直在寻找的缺失的部分(可以避免每次运行buildout时总是重新构建所有部分)。谢谢! - Ida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接