2

我正在开发一个需要在远程服务器上安装 distutils 包的构建脚本。

在 PyPi 上,有 2 种方法可以完成此功能, collective.recipe.distutils 0.1 和 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. 将 subprocess 替换为将使用 distutils api 或 setuptools api 安装包的代码。在我看来,这将是最好的解决方案。

问题是我将如何做#3?

谢谢你,塔拉斯

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

4

3 回答 3

1

zerokspot.recipe.distutils 从根本上被破坏了,它在 setup.py 中添加了对 zc.buildout 的依赖,如下所示:

  1. setup.pyget_version从进口zerokspot.recipe.distutils
  2. 所有的zerokspot.recipe.distutils都在 it's 中定义__init__.py,包括get_version
  3. __init__.pyzerokspot.recipe.distutils进口zc.buildout

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

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

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

于 2009-09-14T08:40:23.887 回答
1

您可以使用subprocess模块在 Python 程序中调用命令行程序:

import subprocess
subprocess.call('python setup.py install')

但是,您对运行此安装的环境有多少控制权?如果它是您正在分发的软件包,那么无论人们提出什么解决方案,您都可能会遇到问题。您将如何处理需要 root 访问权限的情况(例如 sudo python setup.py install)?

您可能会考虑研究Paver,因为它提供的 API 在某些方面是 setuptools 的扩展。

于 2009-09-14T04:12:12.027 回答
0

你确定你不想只生成一个bdist吗?

于 2009-09-14T02:45:42.153 回答