我的工作需要远程服务器上安装的distutils包扩建脚本。
PyPI上有2个食谱这样做collective.recipe.distutils 0.1和0.1.1 zerokspot.recipe.distutils 。
后来的模块前的衍生物,是一种更方便一点,然后在第一,但同样的问题,我现在将描述这两个受到影响。
当执行bootstrap.py,它下载zc.buildout包,并把它变成扩建的鸡蛋目录。 这使./bin/buildout访问zc.buildout代码,但在/ usr /本地/ Python不知道在这一点上约zc.buildout什么。
扩建attepts运行“蟒蛇的setup.py安装”子进程内安装的软件包。 这将产生一个ImportError因为zc.buildout没有安装在/ usr /本地/蟒蛇。
所以,我有几个解决方案。
安装zc.buildout使用easy_install的远程服务器上。 我不喜欢这个选项的话,那让一个特殊情况的模块,这是非常微不足道的。
修改zerokspot.recipe.distutils把try块围绕“进口zc.buildout”这样一来,它会安装即使未安装zc.buildout。 这是一个好的解决办法,但有点hackish的。
代码替换子,将安装使用distutils的API或setuptools的API包。 这将是我认为最好的解决方案。
现在的问题是如何将我做#3?
谢谢你,塔拉斯
PS:我通过创建另一个包,不会对zc.buildout扶养解决了这个问题。 我的包被称为taras.recipe.distutils和它的可用PyPI上。
您可以使用您的Python程序中调用一个命令行程序子模块:
import subprocess
subprocess.call('python setup.py install')
然而,有多少控制你有过的环境,这将安装运行? 如果你正分发包,你将可能有问题,不管别人提出什么样的解决方案。 你将如何处理需要root访问权限(例如sudo的蟒蛇setup.py安装)的情况下?
您可以考虑寻找到摊铺机 ,因为它提供了一个API,是在某些方面的setuptools的延伸。
zerokspot.recipe.distutils是从根本上打破了它增加了对zc.buildout依赖于它的setup.py,如下所示:
-
setup.py
进口get_version
从zerokspot.recipe.distutils
- 所有的
zerokspot.recipe.distutils
在它的定义__init__.py
,包括get_version
-
__init__.py
在zerokspot.recipe.distutils
进口zc.buildout
为什么笔者定义get_version
是一个谜给我; 最好的做法保持在一个简单的版本字符串setup.py
本身并让setuptools的处理开发版本(通过setup.cfg
的版本提取元数据),和的distutils。
一般来说是不导入整个包在一个不错的主意setup.py
因为这将要求所有的包依赖关系是存在在安装时。 显然,包的作者已经zc.buildout安装为一个站点范围内的包并没有注意到他的监督。
最好的办法是到餐桌的包在GitHub上,除去get_version依赖,而你用你的叉子,而不是提出修改的建议原作者所有。