是否可以欺骗 pip install --find-links 使用下载的 sdist 来满足 --editable 要求?

Posted

技术标签:

【中文标题】是否可以欺骗 pip install --find-links 使用下载的 sdist 来满足 --editable 要求?【英文标题】:Is it possible to trick pip install --find-links into using a downloaded sdist for --editable requirements? 【发布时间】:2011-12-05 09:15:24 【问题描述】:

使用以下命令:

pip install -r requirements.txt -d sdists/

您可以轻松地创建需求档案,以便与您的项目一起分发。如果您的要求如下所示,这将非常有用:

Django==1.3.1
django-tagging==0.3.1
django-robots==0.6.1

然后您就可以安装这些要求,而无需触及 PyPI,如下所示:

pip install -r requirements.txt --find-links sdists/ --no-index

是否可以对--editable 要求使用相同的方法?例如:

-e hg+https://bitbucket.org/ubernostrum/django-contact-form/@1d3791fa4dfb#egg=django-contact-form

据我所知,pip install -d 很乐意下载可编辑的需求并为您创建一个 sdist,但 pip install --find-links 没有任何方法可以将下载的 sdist 与您的需求文件中的相关行匹配,所以它忽略下载的 sdist 并继续照常检查 VCS 中的代码。

【问题讨论】:

您可以尝试将PIP_DOWNLOAD_CACHE 设置为某个目录。它适用于 bitbucket 的 tip 压缩包。但我怀疑它是否适用于@revision#egg=package 有没有办法指定操作系统类型?我在 Mac 上工作,但想要 Centos 的下载(例如 cryptography-1.8.1-cp27-cp27m-macosx_10_10_intel.whl 或 cffi-1.10.0-cp27-cp27m-macosx_10_6_intel.whl ) 有一个鲜为人知的功能是指定鸡蛋的版本,例如(...)#egg=django-contact-form==x.y.z。也许这会有所帮助。问题是--find-links 的处理是由 setuptools 完成的,而不是 pip 本身,这使得很多事情变得困难或不可能。 【参考方案1】:

虽然使用 PIP 似乎无法严格执行此操作,但有一种解决方法可以完成相同的操作。解决方法是从原始需求文件和 sdists 目录(仅用于该目录)自动生成第二个需求文件。

一个简单的实现可能看起来像这样(保存在一个名为“make_reqs.py”的文件中):

#!/usr/bin/env python

import re
import sys
import os.path

pat = '.+#egg=(.+)'
allowed_exts = ['.zip', '.tar.gz', 'tar.bz2']

def find_version(sdists_dir, name):
    files = [f for f in os.listdir(sdists_dir) if f.startswith(name)]
    if len(files) != 1:
        return ''
    version = files[0].replace(name+'-', '')
    for ext in allowed_exts:
        version = version.replace(ext, '')
    return version

def get_requirements(file_name, sdists_dir):
    out_reqs = ['--find-links file://%s' % os.path.abspath(sdists_dir)]
    with open(file_name) as req_file:
        reqs = [l.strip() for l in req_file.readlines()]
        for req in reqs:
            match = re.match(pat, req)
            if match and not req.startswith('#'):
                name = match.group(1)
                version = find_version(sdists_dir, name)
                if version:
                    out_reqs.append('%s==%s' % (name, version))
                else:
                    out_reqs.append(req)
            else:
                out_reqs.append(req)
    return out_reqs

if __name__ == '__main__':
    print '\n'.join(get_requirements(*sys.argv[1:]))

要使用该脚本,您可以执行以下操作:

python make_reqs.py requirements.txt /path/to/sdists > sdist_reqs.txt
pip install --no-index -r sdist_reqs.txt

【讨论】:

以上是关于是否可以欺骗 pip install --find-links 使用下载的 sdist 来满足 --editable 要求?的主要内容,如果未能解决你的问题,请参考以下文章

关于pip3 install virtualenvwrapper 报错:ERROR: Could not find a version that satisfies the requirement p

pip install py-find-1st 在 ubuntu20 和 centos 上使用 python3.9 失败

pip install yaml报错ERROR:Could not find a version that satisfies the requirement yaml

Python pip install 安装包报错ERROR: Could not find a version that satisfies the requirement XXX解决方法

pip3 install xxx 失败查找步骤

windows下python的pip install 安装路径在哪