Подтвердить что ты не робот

Замораживание цикла не показывает пути репозитория для файла требований

Я создал среду и добавил пакет 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. Я нашел довольно похожую question в stackoverflow, но автор не был уверен, как ему удалось решить проблему проблема, и принятый ответ, к сожалению, не дает хорошего намека, хотя, судя по комментарию автора, он имеет какое-то отношение к файлу setup.py.

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

4b9b3361

Ответ 1

Простым, но работающим решением будет установка пакета с флагом -e, как pip install -e git+https://bitbucket.org/DataGreed/django-paramfield.git#egg=django-paramfield.

Затем pip freeze показывает полный путь к исходному файлу пакета. Это не лучший способ, которым это должно быть исправлено в пипе, но оно работает. Компонент -e (флаг редактирования) заключается в том, что pip клонирует репозиторий git/hg в /path/to/venv/src/packagename и запускает python setup.py deploy вместо того, чтобы клонировать его в директорию temp и запускать python setup.py install и удалять временную директорию после настройка пакета.

Ответ 2

Здесь script, который сделает это:

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

Ответ 3

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

то есть.

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

Работали как шарм, говорящий о героике