【问题标题】:Can a Python package depend on a specific version control revision of another Python package?Python 包可以依赖于另一个 Python 包的特定版本控制修订吗?
【发布时间】:2011-01-06 10:43:37
【问题描述】:

一些有用的 Python 包在 pypi 上被破坏了,唯一可接受的版本是版本控制系统中的特定版本。可以在setup.py e.g

中表达。

requires = 'svn://example.org/useful.package/trunk@1234'

【问题讨论】:

    标签: python setuptools distutils easy-install pip


    【解决方案1】:

    你需要做两件事。首先,需要您想要的确切版本,例如:

    install_requires = "useful.package==1.9dev-r1234"
    

    然后包含一个dependency_links 设置,指定在哪里找到它:

    dependency_links = ["svn://example.org/useful.package/trunk@1234#egg=useful.package-1.9dev-r1234"]
    

    注意dependency_links URL 的版本#egg= 必须完全 匹配您在install_requires 中指定的内容;这就是将这两个部分联系在一起的原因。

    setuptools 会看到链接上的 #egg 标记,并将 URL 保存为该软件包的精确版本的可用下载 URL。然后,当它稍后尝试解决该要求时,它应该下载该精确的 SVN URL。

    (但是请注意,要让这个真正工作,目标 SVN 修订版必须实际构建一个具有该名称和版本的 egg。否则,您的依赖项将在运行时失败!所以,这个仅当您依赖的软件包在其默认构建版本号中使用 SVN 修订标签时才有效。)

    【讨论】:

    • 是的,它在一般情况下/真的/不起作用...我现在只使用 pip。
    • 不应该“find_links”实际上是“dependency_links”吗?
    • 谢谢,加布里埃尔。我已经修好了。
    • #egg= 部分的dependency_links 网址与您在install_requires 中指定的不完全匹配:它使用-,而您的install_requires 使用==。字符串的哪些部分必须完全匹配?
    【解决方案2】:

    如果您确实需要另一个软件包的晦涩版本,并且无法使用其他版本,您可能希望简单地使用您自己的软件包分发该版本。如有必要,请将其放在您自己的命名空间中,以确保您的版本是使用的版本。

    【讨论】:

      【解决方案3】:

      我还没有弄清楚如何从setup.py 引用它,但pip 可以通过一个简单的需求文件检查 Python 包的特定修订。使用名为 requires.txt 的需求文件,pip install -r requires.txt 将安装该文件中列出的所有包(及其依赖项)。

      这是我的需求文件的一部分。以-e 开头的行从版本控制(git、svn 或 mercurial)中检查包的特定修订,包括我的项目,并以可编辑的形式安装它们。 pip freeze 以这种格式列出所有已安装的软件包。

      requires.txt:

      -e hg+file:///home/me/my-private-project#egg=myproject
      -e hg+http://bitbucket.org/ianb/webob@tip#egg=WebOb
      -e svn+http://svn.sqlalchemy.org/sqlalchemy/trunk@6638#egg=SQLAlchemy
      -e svn+http://svn.zope.org/repos/main/z3c.saconfig/trunk@106508#egg=z3c.saconfig
      ## The following requirements were added by pip --freeze:
      APScheduler==1.01
      simplejson==2.0.9
      ... (many more)
      

      【讨论】:

      • 你真的想要你的依赖的可编辑形式吗?
      【解决方案4】:

      您可以发布特定版本的软件包,但您必须将它们一起分发。无法使用标准 Python 自动下载它们。

      但是,您可以使用 Buildout 并创建一个 buildout.cfg 来复制环境。如果您使用诸如 mr.developer 之类的扩展程序,它可以检查并安装特定的修订版。

      http://pypi.python.org/pypi/zc.buildout http://pypi.python.org/pypi/mr.developer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-04
        • 2018-10-28
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多