我正在开发一个需要在远程服务器上安装distutils包的buildout脚本。
在PyPi上,有两个方法可以做到这一点 collective.recipe.distutils 0.1 and zerokspot.recipe.distutils 0.1.1
后一个模块是前者的衍生物,比第一个稍微方便一点,但两者都遇到了同样的问题,我现在将对此进行描述。
当执行bootstrap.py时,它会下载zc.buildout包并将其放入buildout的egg目录中。这使得./bin/buildout访问zc.buildout代码,但/ usr / local / python此时对zc.buildout一无所知。
Buildout通过在子进程内运行'python setup.py install'来安装程序包。这会产生ImportError,因为没有为/ usr / local / python安装zc.buildout。
所以,我有几个解决方案。
在远程服务器上使用easy_install安装zc.buildout。我根本不喜欢这个选项,它为一个非常微不足道的模块提供了一个特例。
修改zerokspot.recipe.distutils以将try块放在'import zc.buildout'这样的方式,即使没有安装zc.buildout也会安装它。这是一个很好的解决方案,但有些讨厌。
用将使用distutils api或setuptools api安装软件包的代码替换子进程。在我看来,这将是最好的解决方案。
问题是我该怎么做#3?
谢谢你, 塔拉斯
PS:我通过创建另一个不依赖于zc.buildout的包解决了这个问题。我的包名为taras.recipe.distutils,可在pypi上找到。
答案 0 :(得分:1)
您可以使用subprocess模块在Python程序中调用命令行程序:
import subprocess
subprocess.call('python setup.py install')
但是,您对此安装的环境有多少控制权?如果它是您正在分发的包,那么无论人们提出何种解决方案,您都可能会遇到问题。你将如何处理需要root访问权限的情况(例如sudo python setup.py install)?
您可以考虑查看Paver,因为它提供的API在某些方面是setuptools的扩展。
答案 1 :(得分:1)
zerokspot.recipe.distutils从根本上说是在它的setup.py中添加了对zc.buildout的依赖,如下所示:
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依赖项,并在使用fork时向原作者提出更改。
答案 2 :(得分:0)
您确定不想生成bdist吗?