Замораживание цикла не показывает пути репозитория для файла требований
Я создал среду и добавил пакет 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-адресом, но проблема остается.
Ответы
Ответ 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
...
Работали как шарм, говорящий о героике