【问题标题】:How to install distutils packages using distutils api or setuptools api如何使用 distutils api 或 setuptools api 安装 distutils 包
【发布时间】:2010-11-28 00:14:01
【问题描述】:

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

在 PyPi 上有 2 种方法可以做到这一点 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. 将 subprocess 替换为将使用 distutils api 或 setuptools api 安装包的代码。在我看来,这将是最好的解决方案。

问题是我该怎么做#3?

谢谢你, 塔拉斯

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

【问题讨论】:

  • 他的问题是 """ 3. 将 subprocess 替换为将使用 distutils api 或 setuptools api 安装包的代码。在我看来,这将是最好的解决方案。问题是我该怎么做# 3?"""

标签: python distutils buildout


【解决方案1】:

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

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

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

您可以考虑查看Paver,因为它提供的 API 在某些方面是 setuptools 的扩展。

【讨论】:

  • 哦,我正在做我通常的火鸡潜伏动作,但我检查了摊铺机。可能是我的解决方案...谢谢
  • 这正是我试图避免的解决方案。我用更好的信息更新了帖子。
【解决方案2】:

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

  1. setup.pyzerokspot.recipe.distutils 导入 get_version
  2. 所有zerokspot.recipe.distutils 都在它的__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 时向原作者提出更改建议。

【讨论】:

  • 嘿 Martijn,我完全同意你的观点。但我仍然想知道如何做#3。谢谢,塔拉斯
  • 我听从了你的建议。但我没有与 zerokspot 的开发人员合作,因为我不想等待。我仍然想学习如何做#3。
  • 抱歉回复晚了(我的收件箱中的大量压力和大量垃圾邮件通过 tarasm 隐藏了邮件)。关于 setup.py 中对整个包的依赖:对不起,我在其他几个包中修复了它,但似乎我错过了一些。将尽快更新该软件包。顺便说一句:如果你发现我的代码有问题,比如“......从根本上被破坏了”,那么 github 上有一个很好的东西叫做 issue-tracker ;-)
  • 嘿,OP 确实可以为此使用问题跟踪器。 :-) 抱歉,您的包裹听起来不屑一顾,我没有深入研究它的品质,只是为了解决手头的问题。
  • @Horst Gutmann,感谢您维护此软件包。我分叉了你的包裹,这是错误的做法。我将关闭我的包,重新开始使用你的包,如果有其他问题,我会制作一个补丁并提交给你。
【解决方案3】:

您确定不想只生成bdist

【讨论】:

  • 是的,我确定,因为我在一个平台上打包代码并在另一个平台上安装它。我想修改现有的构建配方,所以我只需要这段代码。
猜你喜欢
  • 2011-11-23
  • 2013-07-22
  • 2011-04-18
  • 2010-09-19
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多