在buildout中设置期间导入egg功能

时间:2013-02-02 20:03:23

标签: python buildout egg

我维护的包中的setup.py文件使用另一个包中的代码来构建扩展:

from setuptools import setup, find_packages
from mydependence import build_ext
...
setup(
    name='mypackage',
    version='1.0.0',
    ...
    setup_requires = [
      'mydependence', # is this being checked properly?
    ],
    ...
    install_requires = [
      'mydependence',
    ],
    ...
    )

我想使用zc.buildout构建当前包,因此我创建了一个简单的buildout.cfg文件,如:

[buildout]
parts = python
eggs = mypackage

[python]
recipe = zc.recipe.egg
interpreter = python
eggs = ${buildout:eggs}

不幸的是,这并不像我预期的那样 - 当我执行./bin/buildout并且setup.py被执行时,它会找不到mydependence。当buildout运行我的setup.py时,其sys.path不知道目录eggs下安装的软件包(setuptools本身除外!)。显然,./bin/buildout的路径中包含“egg”和“develop-eggs”的包在运行包setup.py时不会包含。

问题:如何做到这一点?

1 个答案:

答案 0 :(得分:2)

基本问题是,在您调用mydependence方法之前,您已经从setup()导入。我看不出setuptools(或者就此问题而构建)可以忽略你将获得的ImportError

如果我查看一些示例代码,例如http://pythonhosted.org/py2app/examples.html,我会看到如下代码:

from setuptools import setup
setup(
    app=["MyApplication.py"],
    setup_requires=["py2app"],
)

请注意,py2app没有导入。所以setup_requires显然是一种将“扩展”加载到基本setuptools功能的方法。它不是一种规避基本python导入错误的方法。

更新:请在https://stackoverflow.com/a/12061891/27401找到解决方案的@MartijnPieters查看以下评论​​。

Martijn的例子在你的情况下看起来像这样:

import setuptools

setuptools.dist.Distribution(dict(setup_requires='mydependence'))
# `setup_requires` is parsed and acted upon immediately; 
# from here on out the package `mydependence` is installed
# and importable.

from mydependence import build_ext

setup(
    ...
    install_requires = [
      'mydependence',
    ],
    ....
    )
相关问题