1

我维护的包中的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/buildoutsetup.py阅读时,它抱怨mydependence没有找到。当 buildout 运行 mysetup.py时,它sys.path不知道安装在目录下的包eggs(除了setuptools它自己!)。显然,“eggs”和“develop-eggs”中./bin/buildout的包在运行包的setup.py.

问题是:如何使它工作?

4

1 回答 1

2

基本问题是mydependence您在调用该setup()方法之前已经从中导入。我看不出setuptools(或buildout)可以忽略ImportError你会得到的。

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

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

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

更新:请参阅@MartijnPieters 下面的评论,他在https://stackoverflow.com/a/12061891/27401中有解决方案。

在您的情况下,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',
    ],
    ....
    )
于 2013-02-13T21:53:44.083 回答