如何让setup.py安装其他模块

0 投票
2 回答
1684 浏览
提问于 2025-04-17 18:50

我想用 distutils (也就是 setup.py)来安装一个 Python 包,这个包需要从另一个本地仓库获取的包。因为我对 setup 命令的文档了解得不够透彻(我只找到了一些例子 在这里在这里,对 setup 里面的术语 extras_requireinstall_requiredependency_links 感到困惑,这些可以在 这里这里 找到),有没有人能提供一个完整的 setup.py 文件,展示如何处理这种情况,也就是说,当我现在安装的主包需要从某个 SVN 仓库获取的包时,distutils 如何处理这个安装?

更详细的说明:我有两个本地的 SVN(或者 Git)仓库,分别是 basicmoduleextendedmodule。现在我检出 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 个回答

0

看看这两个问题的回答吧。它们都给出了具体的例子,说明了 install_requiresdependency_links 是怎么一起工作的,以达到你想要的效果。

0

我觉得问题出在你的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)中获取。

希望这些能帮到你。

撰写回答