我维护的包中的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
时不会包含。
问题:如何做到这一点?
答案 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',
],
....
)