【问题标题】:How can I make setuptools (or distribute) install a package from the local file system如何让 setuptools(或分发)从本地文件系统安装包
【发布时间】:2012-10-10 13:11:18
【问题描述】:

是否可以在setup.py 中指定(可编辑的)源依赖项,这些依赖项已知驻留在本地文件系统上?

考虑以下目录结构,所有这些都位于单个 VCS 存储库中:

projects
  utils
    setup.py
    ...
  app1
     setup.py
     ... # app1 files depend on ../utils
  app2
     setup.py
     ... # app2 files depend on ../utils

给定以下命令:

cd projects
mkvirtualenv app1
pip install -e app1

我想安装 app1 的所有依赖项,包括“utils”,这是一个“可编辑”依赖项。同样,如果我对 app2 做同样的事情。

我尝试在install_requiresdependency_links 中使用file://... URL 的所有不同组合,但无济于事。我想使用像src+file://../utils 这样的依赖链接URL,它会告诉setuptools 包的源在这个相对路径的文件系统上。有没有办法做到这一点?

【问题讨论】:

  • 这可能会有所帮助:packages.python.org/distribute/…
  • 谢谢,罗伯。在在这里提出问题之前,我对该页面进行了广泛的审查。该页面列出了两类 URL:(1) 直接下载 URL,以及 (2) 包含直接下载链接的网页 URL。我希望我的问题属于第一类,但我不知道如何构建 URL。
  • 我提交了一个patch to pip 来支持dependency_links 中的相对file: URL,这解决了我的问题。希望它尽快合并。
  • 刚遇到这个问题,Rob Wouters 发布的链接已损坏。在此评论中,这是一个有效的方法:pythonhosted.org/setuptools/…
  • 你为什么不在 #github 创建一个帐户并在那里托管你的包/fork。这将允许您将该存储库的特定提交称为依赖项。另外,你只是想让它在你的本地主机上工作吗?或者您想要一个适用于所有对软件包感兴趣的人的强大解决方案?

标签: python packaging setuptools distribute


【解决方案1】:

我有一个相同的问题,我需要依赖同级文件夹中的模块。偶然发现https://caremad.io/2013/07/setup-vs-requirement/

我最终使用 requirements.txt 来专门引用我想要的文件,然后使用

安装所有内容
pip install -r requirements.txt

requirements.txt

-e ../utils                                                                                                                                                                    
-e .

setup.py 拥有我所有的其他依赖项,包括 utils。当 pip 尝试自己安装 app1 时,它意识到 utils 依赖项已经被填充,因此在安装其他需求时跳过它。

【讨论】:

  • requirements.txt 中的相对路径在您进入目录并执行命令的情况下起作用...在父目录中执行相同的命令将不起作用。 pip requirements.txt 文件github.com/pypa/pip/issues/3772的相对路径规范存在问题@
【解决方案2】:

我设法在 setup.py 中提供了相对本地依赖:

setup(
    install_requires=[
        'utils @ file://localhost/%s/../utils/' % os.getcwd().replace('\\', '/'),
        ],
    )

但也许有人知道更好的解决方案

【讨论】:

  • 花了我很长时间才找到这个。到目前为止,这是我见过的唯一可行的解​​决方案。对于使用可编辑的已安装本地包非常有用。
  • 相同的解决方案,但使用 python 3.x 的 f 字符串进行了简化。这还假设您引用的包在文件路径中高于一级,因此“..”:python f"my_package @ file://localhost/{os.getcwd()}/../my_package/"
【解决方案3】:

当我想处理一组相互关联的项目时,我使用/setup.py develop 安装所有项目。

如果我错误地或稍后我想让 pip 安装的模块可编辑,我克隆源代码,并在其上也做一个python setup.py develop,替换现有的。

为了确定,我删除了 virtualenv 的站点包和包本身中的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2018-03-16
    • 2011-03-29
    • 1970-01-01
    • 2016-06-20
    • 2014-06-28
    相关资源
    最近更新 更多