Python 如何使用distutils api或setuptools api安装distutils包

Python 如何使用distutils api或setuptools api安装distutils包,python,distutils,buildout,Python,Distutils,Buildout,我正在编写一个构建脚本,需要在远程服务器上安装distutils包 在PyPi上,有两种方法可以做到这一点 后一个模块是前一个模块的派生,比前一个模块更方便,但两者都有相同的问题,我现在将描述 执行bootstrap.py时,它下载zc.buildout包并将其放入buildout的eggs目录。这使得./bin/buildout可以访问zc.buildout代码,但是/usr/local/python此时对zc.buildout一无所知 Buildout试图通过在子流程内部运行“python

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

在PyPi上,有两种方法可以做到这一点

后一个模块是前一个模块的派生,比前一个模块更方便,但两者都有相同的问题,我现在将描述

执行bootstrap.py时,它下载zc.buildout包并将其放入buildout的eggs目录。这使得./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以在“import zc.buildout”周围放置try块。这样,即使没有安装zc.buildout,它也会安装。这是一个不错的解决方案,但有点粗糙

  • 用将使用distutils api或setuptools api安装包的代码替换子流程。我认为这是最好的解决办法

  • 问题是我该怎么做

    谢谢,, 塔拉斯


    PS:我通过创建另一个不依赖于zc.buildout的包解决了这个问题。我的程序包被调用,可在pypi上使用。

    您确定不只是生成一个命令行程序吗?

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

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


    你可以考虑一下,因为它提供了一种API,它在某种程度上是StudioToots的扩展。

    < Pr.ZeNoSk.Ray.diditul基本上被打破了,因为它在Studio.Py中添加了对ZC.BudidUd的依赖性,如下:

  • setup.py
    zerokspot.recipe.distutils
  • 所有的
    zerokspot.recipe.distutils
    都在它的
    \uuuu init\uuuuu.py
    中定义,包括
    get\u version
  • zerokspot.recipe.distutils中的
    导入
    zc.buildout
  • 为什么作者定义
    get\u version
    对我来说是个谜;最佳实践在
    setup.py
    本身中保留一个简单的版本字符串,并允许setuptools处理dev版本(通过
    setup.cfg
    ),以及用于版本元数据提取的distutil

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


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

    是的,我确定,因为我在一个平台上打包代码,然后在另一个平台上安装。我想修改一个现有的构建配方,所以我只需要这段代码。哦,我正在做我通常的火鸡潜伏动作,但我检查了摊铺机。可能是我的解决方案。。。谢谢这正是我试图避免的解决方案。我用更好的信息更新了这篇文章。他的问题是“3.用将使用distutils api或setuptools api安装包的代码替换子流程。在我看来,这将是最好的解决方案。问题是我将如何做#3?”“嘿,Martijn,我完全同意你的观点。但我还是想知道怎么做。谢谢,塔拉西听从了你的建议。但我没有与zerokspot的开发人员合作,因为我不想等待。我仍然想学习如何做#3.很抱歉反应太晚(我的收件箱中有大量的压力和垃圾邮件,这些邮件被塔拉斯姆隐藏了)。关于setup中对整个软件包的依赖性。py:很抱歉,我在其他几个软件包中修复了这个问题,但似乎有几个软件包没有修复。将尽快更新该包。顺便说一句:如果你发现我的代码有一个问题,比如“…基本上被破坏了”,github上有一个很好的东西叫做问题跟踪器;-)嘿,OP真的可以用问题追踪器来解决这个问题。:-)很抱歉听起来对你的包裹不屑一顾,我没有深入研究它的品质,只是为了解决眼前的问题。@Horst Gutmann,谢谢你维护这个包裹。我用叉子叉了你的包裹,这是错误的。我将关闭我的软件包,再次开始使用你的软件包,如果出现其他问题,我将制作一个补丁并提交给你。
    import subprocess
    subprocess.call('python setup.py install')