如何使用distutils api或setuptools api安装distutils软件包

时间:2009-09-14 01:53:28

标签: python distutils buildout

我正在开发一个需要在远程服务器上安装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。

所以,我有几个解决方案。

  1. 在远程服务器上使用easy_install安装zc.buildout。我根本不喜欢这个选项,它为一个非常微不足道的模块提供了一个特例。

  2. 修改zerokspot.recipe.distutils以将try块放在'import zc.buildout'这样的方式,即使没有安装zc.buildout也会安装它。这是一个很好的解决方案,但有些讨厌。

  3. 用将使用distutils api或setuptools api安装软件包的代码替换子进程。在我看来,这将是最好的解决方案。

  4. 问题是我该怎么做#3?

    谢谢你, 塔拉斯

    PS:我通过创建另一个不依赖于zc.buildout的包解决了这个问题。我的包名为taras.recipe.distutils,可在pypi上找到。

3 个答案:

答案 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的依赖,如下所示:

  1. setup.pyget_version
  2. 导入zerokspot.recipe.distutils
  3. 所有zerokspot.recipe.distutils都在__init__.py中定义,包括get_version
  4. __init__.py导入zerokspot.recipe.distutils
  5. zc.buildout

    为什么作者定义get_version对我来说是个谜;最佳实践在setup.py本身中保留一个简单的版本字符串,并让setuptools处理开发版本(通过setup.cfg),并使用distutils进行版本元数据提取。

    通常,在setup.py中导入整个包不是一个好主意,因为这需要在安装时出现所有包依赖项。显然,该软件包的作者已将zc.buildout作为站点范围的软件包安装,并且没有注意到他的疏忽。

    最好的办法是在github上分发包,删除get_version依赖项,并在使用fork时向原作者提出更改。

答案 2 :(得分:0)

您确定不想生成bdist吗?