Python包可以依赖于另一个Python包的特定版本控制修订吗?

时间:2010-01-18 16:25:37

标签: python setuptools distutils easy-install pip

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

来表达

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

4 个答案:

答案 0 :(得分:12)

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

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

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

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

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

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

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

答案 1 :(得分:2)

如果你真的需要另一个软件包的模糊版本,并且没有办法与其他版本一起使用,你可能只想用你自己的版本分发该版本的软件包。如有必要,请将其放在您自己的命名空间中,以确保您的版本是使用的版本。

答案 2 :(得分:2)

我还没有想出如何从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)

答案 3 :(得分:1)

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

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

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