Pip freeze не показывает пути репозитория для файла требований

Я создал среду и добавил пакет django-paramfield через git:

$ 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? Должен ли я как-то изменить его, чтобы отразить РЕПО URL-адрес?

UPD2: я нашел довольно похожий вопрос в stackoverflow, но автор не был уверен, как ему удалось решить проблему, и принятый ответ, К сожалению, не дает хорошего намека, хотя, судя по комментарию автора, это имеет какое-то отношение к setup.py файл.

UPD3: я пытался передать download_url in setup.py и установка пакета через pip с этим url, но он проблема сохраняется.

3 ответов


простым, но рабочим обходным путем было бы установить пакет с -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 вместо того, чтобы клонировать его в temp dir и запустить python setup.py install и удалите temp dir после настройки пакета.


вот скрипт, который сделает это:

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

Это старый вопрос, но я только что проработал эту же проблему и разрешение Просто добавьте путь к РЕПО (git в моем случае) к требованиям fie вместо имени пакета

то есть

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

работал как шарм deplying на Heroku