是否可以欺骗pip install findlinks使用下载的sdist来满足可编辑的需求?

2024-09-29 06:29:08 发布

您现在位置:Python中文网/ 问答频道 /正文

使用以下命令:

pip install -r requirements.txt -d sdists/

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

^{pr2}$

然后,您可以安装这些需求,而不必接触PyPI,如下所示:

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

是否可以对--editable需求使用相同的方法?E、 g.:

-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检查代码。在


Tags: installpip项目django命令formtxtpypi
1条回答
网友
1楼 · 发布于 2024-09-29 06:29:08

虽然使用PIP并不能严格做到这一点,但是有一种解决方法可以实现相同的功能。解决方法是从原始需求文件和sdists目录(仅用于该目录)自动生成第二个需求文件。在

一个简单的实现可能如下所示(保存在名为“make”的文件中_需求量“):

#!/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:]))

要使用脚本,请执行以下操作:

^{pr2}$

相关问题 更多 >