如何让setup.py安装其他模块
我想用 distutils
(也就是 setup.py
)来安装一个 Python 包,这个包需要从另一个本地仓库获取的包。因为我对 setup
命令的文档了解得不够透彻(我只找到了一些例子 在这里 和 在这里,对 setup
里面的术语 extras_require
、install_require
和 dependency_links
感到困惑,这些可以在 这里 和 这里 找到),有没有人能提供一个完整的 setup.py
文件,展示如何处理这种情况,也就是说,当我现在安装的主包需要从某个 SVN 仓库获取的包时,distutils
如何处理这个安装?
更详细的说明:我有两个本地的 SVN(或者 Git)仓库,分别是 basicmodule
和 extendedmodule
。现在我检出 extendedmodule
并运行 python setup.py install
。这个 setup.py
文件知道 extendedmodule
需要 basicmodule
,并会自动从仓库下载并安装它(如果还没有安装的话)。我该如何用 setup.py
来解决这个问题?或者有没有其他更好的方法?
编辑:后续问题
根据 Tom 的回答,我尝试使用以下的 setup.py
:
from setuptools import setup
setup(
name = "extralibs",
version = "0.0.2",
description = ("Some extra libs."),
packages=['extralib'],
install_requires = "basiclib==1.9dev-r1234",
dependency_links = ["https://source.company.xy/svn/MainDir/SVNDir/basiclib/trunk@20479#egg=basiclib-1.9dev-r1234"]
)
当我作为普通用户尝试安装时,出现了以下错误:
error: Can't download https://source.company.xy/svn/MainDir/SVNDir/basiclib/trunk@20479: 401 Authorization Required
但是当我用完全相同的链接进行正常的 svn
检出时,它是可以工作的:
svn co https://source.company.xy/svn/MainDir/SVNDir/basiclib/trunk@20479
有没有什么建议可以在不更改 SVN 仓库的任何配置的情况下解决这个问题?
2 个回答
看看这两个问题的回答吧。它们都给出了具体的例子,说明了 install_requires
和 dependency_links
是怎么一起工作的,以达到你想要的效果。
我觉得问题出在你的svn客户端已经进行了身份验证(在~/.subversion目录下缓存了一些信息),而你的distutils的http客户端不知道怎么处理这些信息。
Distutils支持svn+http这种链接类型来处理依赖关系。所以你可以试着在你的依赖链接前加上“svn+”,并提供用户名和密码:
dependency_links = ["svn+https://user:password@source.company.xy/svn/MainDir/SVNDir/basiclib/trunk@20479#egg=basiclib-1.9dev-r1234"]
出于安全考虑,你不应该把用户名和密码直接写在setup.py文件里。可以考虑从环境变量中获取这些认证信息,或者尝试从你的svn配置目录(~/.subversion)中获取。
希望这些能帮到你。