在zc.buildout中,如何安装鸡蛋A,然后安装鸡蛋B需要鸡蛋A才能正确安装?

时间:2012-02-25 01:13:01

标签: python cython buildout pymssql

具体来说,这就是我遇到的情况:

我使用zc.buildout来安装需要pymssql的应用程序。 Pymssql需要Cython才能正确安装。但是,我不想修改我的运行环境,所以我想做一些像:

  1. 安装Cython
  2. 将Cython加载到buildout
  3. 安装Pymssql。
  4. 我认为Buildout已经这样做了,但看起来更像是检查setup.cfg以确保安装了任何明确声明的内容。目前我的扩建看起来像:

    [buildout]
      parts = required-eggs
      ...
    
    [required-eggs]
      eggs = Cython
             pymssql
    

    Cython安装正常。不幸的是pymssql没有:

        return self.build_and_install(setup_script, setup_base)
      File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 1101, in build_and_install
    self.run_setup(setup_script, setup_base, args)
      File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 1090,  in run_setup
    run_setup(setup_script, args)
      File "/usr/lib/python2.7/dist-packages/setuptools/sandbox.py", line 29, in run_setup
    lambda: execfile(
      File "/usr/lib/python2.7/dist-packages/setuptools/sandbox.py", line 70, in run
    return func()
      File "/usr/lib/python2.7/dist-packages/setuptools/sandbox.py", line 31, in <lambda>
    {'__file__':setup_script, '__name__':'__main__'}
      File "setup.py", line 41, in <module>
    ImportError: No module named Cython.Distutils
    

    因此,我认为Cython是作为一个egg安装的,但是没有加载到运行buildout的python进程中。在buildout中是否有一些配置允许我这样做?

1 个答案:

答案 0 :(得分:2)

pymssql包alreade将Cython egg声明为setup_requires依赖项,但不会给distutils时间安装它。只需在setup_requires中列出它们但仍尝试在模块范围内导入它们(如pymssql那样)是不够的。

必须重新构造setup.py模块,以便在解析Cython行并且其中列出的依赖项可用之前不导入setup_requires依赖项。基本上,它需要定义它自己的build_cmd类,在实例化时,导入Cython依赖项并在那时包装该类,而不是之前。

可能您可以创建一个自定义构建配方,使用Cython作为依赖项,然后可以在buildout执行您的配方时安装pymssql依赖项和Cython。但这是pymssql应该处理的伤口上的膏药,真的。