【问题标题】:Pip freeze does not show repository paths for requirements filePip freeze 不显示需求文件的存储库路径
【发布时间】:2017-03-17 12:32:39
【问题描述】:

我已经创建了一个环境,并通过 git 添加了一个包 django-paramfield:

$ pip install git+https://bitbucket.org/DataGreed/django-paramfield.git
Downloading/unpacking git+https://bitbucket.org/DataGreed/django-paramfield.git
  Cloning https://bitbucket.org/DataGreed/django-paramfield.git to /var/folders/9Z/9ZQZ1Q3WGMOW+JguzcBKNU+++TI/-Tmp-/pip-49Eokm-build
Unpacking objects: 100% (29/29), done.
  Running setup.py egg_info for package from git+https://bitbucket.org/DataGreed/django-paramfield.git
Installing collected packages: paramfield
  Running setup.py install for paramfield
Successfully installed paramfield
Cleaning up...

但是当我想创建一个需求文件时,我只看到包名:

$ pip freeze
paramfield==0.1
wsgiref==0.1.2

如何让它输出整个字符串git+https://bitbucket.org/DataGreed/django-paramfield.git 而不仅仅是一个包名?包不在 PyPi 中。

UPD:也许,它与 setup.py 有关系?我应该以某种方式更改它以反映回购网址吗?

UPD2:我在 stackoverflow 中发现了一个非常相似的 question,但作者不确定他是如何解决问题的,不幸的是,接受的答案并没有给出很好的提示,虽然从作者的评论来看,它与 setup.py 文件有关。

UPD3:我尝试在 setup.py 中传递 download_url 并使用此 url 通过 pip 安装包,但问题仍然存在。

【问题讨论】:

标签: python pip dependency-management


【解决方案1】:

一个简单但可行的解决方法是安装带有-e 标志的软件包,例如pip install -e git+https://bitbucket.org/DataGreed/django-paramfield.git#egg=django-paramfield

然后pip freeze 显示包的完整源路径。这不是应该在 pip 中修复的最佳方法,但它正在工作。 -e(编辑标志)的权衡是 pip 将 git/hg 存储库克隆到 /path/to/venv/src/packagename 并运行 python setup.py deploy 而不是将其克隆到临时目录并运行 python setup.py install 并在设置后删除临时目录包。

【讨论】:

【解决方案2】:

这里有一个脚本可以做到这一点:

#!/usr/bin/env python

from subprocess import check_output
from pkg_resources import get_distribution

def download_url(package):
    dist = get_distribution(package)
    for line in dist._get_metadata('PKG-INFO'):
        if line.startswith('Download-URL:'):
            return line.split(':', 1)[1]


def main(argv=None):
    import sys
    from argparse import ArgumentParser

    argv = argv or sys.argv

    parser = ArgumentParser(
        description='show download urls for installed packages')
    parser.parse_args(argv[1:])

    for package in check_output(['pip', 'freeze']).splitlines():
        print('{}: {}'.format(package, download_url(package) or 'UNKNOWN'))


if __name__ == '__main__':
    main()

【讨论】:

  • 但是为什么 pip freeze 不这样做呢?通常它显示回购网址
【解决方案3】:

这是一个老问题,但我刚刚解决了同样的问题和解决方案 只需将 repo 的路径(在我的情况下为 git)添加到需求文件而不是包名称

...
celery==3.0.19
# chunkdata isn't available on PyPi
https://github.com/aaronmccall/chunkdata/zipball/master
distribute==0.6.34
... 

就像一个依赖于heroku的魅力

【讨论】:

  • 当然,它与接受的答案基本相同 - pip freeze 会生成类似的行;)
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 2020-05-20
  • 2017-07-07
  • 2016-05-30
  • 2019-01-24
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多