如何在setup.py中包含git依赖项以进行pip安装

16

我需要将公共 Github 存储库中可用的 Python 包与我的 Python(2.7)包一起包含。 我的包应该可以通过 setup.py 使用 pip 进行安装。

到目前为止,这可以通过在 setup.py 文件中使用 dependency_links 来完成:

setuptools.setup(
   name="my_package",
   version="1.0",
   install_requires=[
       "other_package==1.2"
   ],
   dependency_links=[
      "https://github.com/user/other_package/tarball/master#egg=other_package-1.2"
   ]    
)

即使使用--process-dependency-links标志安装软件包时,此方法仍然有效,但是dependency_links功能似乎已被弃用,因为:

pip install git+https://github.com/user/my_package@master#egg=my_package-1.0 --process-dependency-links

给我以下警告:

DEPRECATION: Dependency Links processing has been deprecated and will be removed in a future release.
有没有其他的方法可以在支持pip安装的情况下,在setup.py文件中包含git依赖项?假设我发现了other_package中的一个错误,我会fork它的仓库并在Github上修复该问题并提出pull请求。我的pull请求不会被立即接受(或永远不会被接受,因为该软件包不再得到积极维护)。我想将my_package与我fork的other_package一起分发,并希望用户能够使用pip安装my_package而无需了解此需求的详细信息并且无需在安装时提供任何其他标志。my_package的用户还应该能够将my_package作为其自定义软件包的需求进行包含。考虑到不同的安装模式(wheels、eggs、develop等),如何实现这一目标?

在托管环境中,您不能像在标准的Google App Engine中那样总是指定“--process-dependency-links”,而需要使用外部私有存储库来满足需求。 - kuza
2个回答

3

我遇到了完全相同的问题(在另一个项目中发现了一个 bug,我的项目依赖于此,发送了一个 pull request,但没有时间等待合并)。

我通过将以下行添加到 install_requires 中解决了这个问题:

'my-package @ https://github.com/user/my-package/archive/master.tar.gz'

1
作为一条注释,我后来发现 PyPI 不允许您发布具有 URL 依赖项的软件包。如果您需要在 PyPI 上发布,则 Philip 的另一个答案更好。 - Zach

1
个人而言,我会避免将git仓库作为依赖项。在您描述的情况下,我看到两个选择。
当包未维护时,您可以分叉该项目并分发自己的版本,或将分叉代码作为您自己的代码子模块分发(即直接在可分发包中包括外部依赖项)。
个人而言,我更喜欢分发自己的版本。
当该包尚未包含您的错误修复时,在这种情况下,我会将修复后的代码作为您的软件包的一部分分发,直到错误被修复为止。

@h345k34cr,我理解为什么这个答案可能会让人感到沮丧。不幸的是,自从该功能被弃用以来,我不知道它是否可以完成,并且我认为之所以弃用该功能是因为不应该这样做。因此,我提供了选项作为一种方式,让人们在该功能不再起作用并且删除该功能是有意设计的情况下实现相同的最终目标,而不是提供一个破坏事物的笨拙解决方法。 - Philip Adler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接