如何让 setuptools 安装 PyPI 上没有的包?
- 2025-03-05 09:14:00
- admin 原创
- 95
问题描述:
我刚刚开始使用 setuptools 和 virtualenv。我的软件包需要最新的 python-gearman,但只能从 GitHub 获得。PyPI 上的 python-gearman 版本是旧版本。Github 源与 setuptools 兼容,即有 setup.py 等。有没有办法让 setuptools 下载并安装新版本,而不是在 PyPI 上查找并安装旧版本?
仅供参考,新的 python-gearman 是http://github.com/mtai/python-gearman
解决方案 1:
关键是告诉 easy_install 包可以在哪里下载。在这个特定情况下,可以在 URL http://github.com/mtai/python-gearman/tarball/master找到它。但是,该链接本身不起作用,因为 easy_install 无法仅通过查看 URL 来判断它将获得什么。
通过将其更改为http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta,easy_install将能够识别软件包名称及其版本。
最后一步是将 URL 添加到你的包的 dependency_links 中,例如:
setup(
...
dependency_links = ['http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta']
)
现在,当安装您的软件包时,easy_install 将发现有一个“gearman 2.0.0beta”可从该 URL 下载,并且很高兴地选择它而不是 PyPI 上的那个,如果您在依赖项中指定“gearman>=2.0.0beta”。
(通常,这种做法是在某人的 PyPI 页面上包含一个可下载源的链接;在这种情况下,如果 gearman 包的作者已经包含了一个像上面这样的链接,那么你已经设置好了。通常,人们用“myproject-dev”标记开发版本,然后人们使用“myproject>=somever,==dev”的要求,这样如果没有 somever 或更高版本的包,easy_install 将尝试签出或下载该版本。)
--process-dependency-links
使用时需要指定pip
。请注意,依赖项链接处理已被弃用,并将在未来版本中删除。
解决方案 2:
您可以使用该pip install protocol+location[@tag][#egg=Dependency]
格式通过 pip 直接从源代码进行安装。
Git
pip install git+https://github.com/username/repo.git
pip install git+https://github.com/username/repo.git@MyTag
pip install git+https://github.com/username/repo.git@MyTag#egg=ProjectName
Mercurial
pip install hg+https://hg.myproject.org/MyProject/
SVN
pip install svn+svn://svn.myproject.org/svn/MyProject
苯并芘
pip install bzr+http://bzr.myproject.org/MyProject/trunk
支持以下协议:[+git, +svn, +hg, +bzr]
版本
@tag
让您指定要检出的特定版本/标签。
#egg=name
让您指定项目对其他项目的依赖关系。
顺序必须始终是@tag#egg=name
。
私有存储库
您还可以通过将协议更改为 SSH(ssh://
)并添加适当的用户(git@
)来从私有存储库安装:
git+ssh://git@github.com/username/my_private_repo
您还可以使用用户名/密码从私人存储库进行安装。
git+https://<username>:<password>@github.com/<user>/<repo>.git
Github 提供了创建可循环使用的个人 OAuth 令牌的功能
git+https://<oauth token>:x-oauth-basic@github.com/<user>/<repo>.git
要求.txt
requirements.txt
用于指定项目依赖项:
要求.txt
package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git
这些不会随包自动安装,必须使用命令进行安装pip -r requirements.txt
。
包括需求文件
需求文件可以包括其他需求文件:
要求-docs.txt
sphinx
-r requirements-dev.txt
要求-dev.txt
some-dev-tool
-r requirements.txt
要求.txt
package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git
设置.py
setup.py
需求文件可以使用以下命令安装指定的依赖项:
-e .
setup.py
也可以使用与上述相同的语法从存储库安装,但使用此答案dependency_links
中提到的值。
参考:
https://pip.pypa.io/en/latest/user_guide.html#installing-packages
https://pip.pypa.io/en/latest/reference/pip_install.html
解决方案 3:
因为我必须做同样的事情,所以我找到了另一种方法来做到这一点,pip
因为根据此评论,--process-dependency-links
计划在 19.0 中删除。pip
pip
18.1 包含以下功能
允许将 PEP 508 URL 要求用作依赖项。
根据PEP 508 的描述,此类 URL 依赖关系的语法如下:
基于 URL 的最小查找:
pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686
所以在你的setup.py
看起来就像
setup(
...
install_requires = [
...
'python-gearman @ https://github.com/mtai/python-gearman/archive/master.zip'
...
]
)
请注意,该链接是一个存档文件,也可能是存储库的特定版本或分支,如本答案中所述。另外,请参阅该答案以了解如何与其他存储库主机合作。
据我所知,更新依赖项的最简单方法是从其pip install -I .
目录安装包时使用。
解决方案 4:
Vanillasetuptools
不支持直接从 git 存储库下载,但你可以使用该页面中的其中一个下载源链接,例如:
easy_install http://github.com/mtai/python-gearman/tarball/master
扫码咨询,免费领取项目管理大礼包!