2012-02-25 3 views
26

Я следую за этот учебник: http://devcenter.heroku.com/articles/djangoОт virtualenv, pip freeze> requirements.txt дают ТОНЫ мусора! Как обрезать его?

В какой-то момент я suposed сделать:

pip freeze > requirements.txt 

(. OFC из virtualenv создан экземпляр питона)

И я получаю это :

(venv)[email protected]:~/Programowanie/hellodjango$ cat requirements.txt 
BeautifulSoup==3.2.0 
Brlapi==0.5.5 
CherryPy==3.1.2 
ClientForm==0.2.10 
Django==1.3 
GnuPGInterface==0.3.2 
PAM==0.4.2 
PIL==1.1.7 
Routes==1.12.3 
Twisted-Core==11.0.0 
Twisted-Names==11.0.0 
Twisted-Web==11.0.0 
WebOb==1.0.8 
adium-theme-ubuntu==0.3.1 
apt-xapian-index==0.44 
apturl==0.5.1ubuntu1 
chardet==2.0.1 
command-not-found==0.2.44 
configglue==1.0 
cssutils==0.9.8a1 
defer==1.0.2 
distribute==0.6.19 
django-tagging==0.3.1 
dnspython==1.9.4 
duplicity==0.6.15 
gnome-app-install==0.4.7-nmu1ubuntu2 
httplib2==0.7.2 
jockey==0.9.4 
keyring==0.6.2 
launchpadlib==1.9.8 
lazr.restfulclient==0.11.2 
lazr.uri==1.0.2 
louis==2.3.0 
lxml==2.3 
mechanize==0.1.11 
nvidia-common==0.0.0 
oauth==1.0.1 
onboard==0.96.1 
oneconf==0.2.6.7 
papyon==0.5.5 
pexpect==2.3 
piston-mini-client==0.6 
protobuf==2.4.0a 
psycopg2==2.4.4 
pyOpenSSL==0.12 
pycrypto==2.3 
pycups==1.9.59 
pycurl==7.19.0 
pyinotify==0.9.1 
pyparsing==1.5.2 
pyserial==2.5 
pysmbc==1.0.10 
python-apt==0.8.0ubuntu9 
python-dateutil==1.4.1 
python-debian==0.1.20ubuntu2 
python-virtkey==0.60.0 
pyxdg==0.19 
sessioninstaller==0.0.0 
simplejson==2.1.6 
system-service==0.1.6 
ubuntu-sso-client==1.4.0 
ubuntuone-couch==0.3.0 
ubuntuone-installer==2.0.0 
ubuntuone-storage-protocol==2.0.0 
ufw==0.30.1-2ubuntu1 
unattended-upgrades==0.1 
usb-creator==0.2.23 
virtualenv==1.6.4 
wadllib==1.2.0 
wsgiref==0.1.2 
xdiagnose==1.1 
xkit==0.0.0 
zope.interface==3.6.1 

при развертывании на Heroku он не в Brlapi .....

Я вижу много вещей из моей основной установки python, которая находится на ubuntu. Что плохо, поскольку Ubuntu использует python для нескольких вещей (ubuntu-one, usb-creator и т. Д.).

Мне они не нужны на героку! Мне нужно только Django, psycopg2 и их зависимости. Я даже не знаю, была ли его ошибка в пипе, или вирутален. (Если вы хотите узнать, что моя установка посмотрит на ссылку выше, я скопировал ее в терминал)

ответ

26

Это одна вещь, которая слишком сильно исказила меня. Это происходит, когда вы создаете virtualenv без флага --no-site-packages.

Есть несколько вещей, которые вы можете сделать:

  1. Создать virtualenv с --no-site-packages флагом.
  2. При установке приложений не запускайте непосредственно pip install <name>, вместо этого сначала добавьте библиотеку в свой requirements.txt, а затем установите требования. Это медленнее, но гарантирует, что ваши требования будут обновлены.
  3. Вручную удалите библиотеки, которые вам не нужны. Следующее правило для этого - добавить все, что есть в моем INSTALLED_APPS, и адаптеры баз данных. Большинство других требуемых библиотек будут автоматически установлены из-за зависимостей. Я знаю его глупо, но это то, что я обычно делаю.

- Edit -

Я с тех пор написал couple of scripts, чтобы помочь справиться с этим. Первый запускает pip freeze и добавляет найденную библиотеку в предоставленный файл требований, другой - запускает установку pip, а затем добавляет ее в файл требований.

function pipa() { 
    # Adds package to requirements file. 
    # Usage: pipa <package> <path to requirements file> 
    package_name=$1 
    requirements_file=$2 
    if [[ -z $requirements_file ]] 
    then 
     requirements_file='./requirements.txt' 
    fi 
    package_string=`pip freeze | grep -i $package_name` 
    current_requirements=`cat $requirements_file` 
    echo "$current_requirements\n$package_string" | LANG=C sort | uniq > $requirements_file 
} 

function pipia() { 
    # Installs package and adds to requirements file. 
    # Usage: pipia <package> <path to requirements file> 
    package_name=$1 
    requirements_file=$2 
    if [[ -z $requirements_file ]] 
    then 
     requirements_file='./requirements.txt' 
    fi 
    pip install $package_name 
    pipa $package_name $requirements_file 
} 
+17

Примечание: так как v. 1.7, virtualenv принимает '--no-site-packages' по умолчанию, поэтому вам не нужно указывать эту опцию. Это значение по умолчанию. Ссылка: http://pypi.python.org/pypi/virtualenv#changes-news – Paolo

+0

Thx! -no-site-packages работает отлично! (Хотя я все еще озадачен, почему команда герою не упомянула об этом в своих документах). (И да, я использовал Ubuntu 11.10 предоставленный пакет, содержащий virtualenv 1.6.4 :(:(:() –

+0

Если вы используете последнюю версию virtualenv, '--no-site-packages' больше не нужны. Я настоятельно рекомендую не полагаться на модули python от aptitude :) –

10

Если вы заботитесь много о чистоте вашего requirements.txt вы должны использовать не только --no-site-packages вариант, как уже упоминалось, но и рассматривать не конвейерный выпуск pip freeze непосредственно к requirements.txt. Причиной этого является то, что при выполнении pip freeze отображаются не только указанные вами пакеты, но и зависимости, установленные этими пакетами! Нет необходимости хранить их в своем requirements.txt, так как они автоматически устанавливаются с пакетом, который их требует ... Итак, если вы добавите новый пакет в свой виртуальный канал, вы, вероятно, должны просто добавить строку для этого пакета на свой requirements.txt ...

Смотрите этот пример:

(demo)[~]$ pip freeze 
distribute==0.6.19 
wsgiref==0.1.2 
(demo)[~]$ pip install django-blog-zinnia 
Downloading/unpacking django-blog-zinnia 
    Downloading django-blog-zinnia-0.9.tar.gz (523Kb): 523Kb downloaded 
    Running setup.py egg_info for package django-blog-zinnia 

    no previously-included directories found matching 'docs/api' 
    no previously-included directories found matching 'docs/build' 
    no previously-included directories found matching 'docs/coverage' 
    no previously-included directories found matching 'zinnia/media/zinnia/css/.sass-cache' 
Downloading/unpacking BeautifulSoup>=3.2.0 (from django-blog-zinnia) 
    Downloading BeautifulSoup-3.2.1.tar.gz 
    Running setup.py egg_info for package BeautifulSoup 

    # truncated as it installs some more dependencies 
Successfully installed django-blog-zinnia BeautifulSoup django-mptt django-tagging django-xmlrpc pyparsing 
Cleaning up... 
(demo)[~]$ pip freeze 
BeautifulSoup==3.2.1 
distribute==0.6.19 
django-blog-zinnia==0.9 
django-mptt==0.5.2 
django-tagging==0.3.1 
django-xmlrpc==0.1.3 
pyparsing==1.5.6 
wsgiref==0.1.2 

(. Хотя я, вероятно, следует отметить, что в большинстве случаев это не повредит, что у вас есть эти зависимости есть, только ваш файл будет расти и становиться все труднее поддерживать)

+0

Nah! Я просто хотел, чтобы быстрое решение для разделения моих библиотек python, связанных с ОС, из моих библиотек разработки django, которые должны быть установлены на машине развертывания! (поведение по умолчанию по умолчанию для исправления ошибок ipho должно быть изменено ...) –

+3

Я думаю, вы абсолютно должны содержать все косвенные зависимости в ваших требованиях.txt на самом деле, вместе с их номерами версий. так что ваши сборки повторяемы. Я использовал мои прямые требования в верхней части файла и мои косвенные («транзитивные») зависимости внизу. Теперь я просто держу их всех в одном файле, используя pip freeze для генерации информации, но с комментариями и в алфавитном порядке. – tobych

7

pipreqs решает проблему. Он генерирует файл уровня проекта require.txt.

  • Установка pipreqs: pip install pipreqs
  • Генерировать файл на уровне проекта requirement.txt: pipreqs /path/to/your/project/ требования файл будет сохранен в /path/to/your/project/requirements.txt
+2

Проверено. Сделал бы работу совершенно красиво. –

+0

К сожалению, это не сработает, оно создает требования, но все же некоторые модули отсутствуют – Roman

+1

@Roman, если вы используете virtualenv для запуска своего проекта, PLS убедитесь, что вы используете pip, который принадлежит виртуальной установке install 'pipreqs' – haifzhan