web-dev-qa-db-fra.com

Depuis virtualenv, pip freeze> requirements.txt donne des TONNES de déchets! Comment le couper?

Je suis ce tutoriel: http://devcenter.heroku.com/articles/Django

À un moment donné, je suis censé faire:

pip freeze > requirements.txt

(Ofc. À partir de l'instance créée par virtualenv de python)

Et je reçois ceci:

(venv)przemoli@ubuntu:~/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

Lors du déploiement sur heroku, il échoue à Brlapi .....

Je vois beaucoup de choses de mon installation principale python qui est sur ubuntu. Ce qui est MAUVAIS depuis Ubuntu utilise python pour pas mal de choses lui-même (ubuntu-one , usb-creator, etc.).

Je n'en ai pas besoin sur heroku! Je n'ai besoin que de Django, psycopg2 et de leurs dépendances. Je ne sais même pas si c'est la faute de pip, ou virutalenv. (Si vous voulez connaître ma configuration, regardez le lien ci-dessus, je l'ai copié dans le terminal)

28
przemo_li

C'est une chose qui m'a trop énervé. Cela se produit lorsque vous créez un virtualenv sans le --no-site-packages drapeau.

Il y a quelques choses que vous pouvez faire:

  1. Créez virtualenv avec le --no-site-packages drapeau.
  2. Lors de l'installation des applications, ne lancez pas pip install <name> directement, à la place, ajoutez la bibliothèque à votre requirements.txt d'abord, puis installez la configuration requise. Cette opération est plus lente mais garantit que vos exigences sont mises à jour.
  3. Supprimez manuellement les bibliothèques dont vous n'avez pas besoin. Une règle d'or que je suis pour cela consiste à ajouter tout ce qu'il y a dans mon INSTALLED_APPS et les adaptateurs de base de données. La plupart des autres bibliothèques requises seront installées automatiquement en raison des dépendances. Je sais que c'est idiot, mais c'est ce que je finis habituellement par faire.

-- Éditer --

J'ai depuis écrit un quelques scripts pour aider à gérer cela. Le premier exécute pip freeze et ajoute la bibliothèque trouvée à un fichier d'exigences fourni, l'autre, exécute pip install, puis l'ajoute au fichier d'exigences.

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
}
26
zsquare

Si vous vous souciez beaucoup de la propreté de votre requirements.txt vous ne devez pas seulement utiliser le --no-site-packages comme déjà mentionné, mais pensez également à ne pas diriger la sortie de pip freeze directement sur votre requirements.txt. La raison en est que lorsque vous faites un pip freeze non seulement les packages spécifiés par vous-même apparaissent, mais aussi les dépendances installées par ces packages! Il n'est pas nécessaire de les conserver tous dans votre requirements.txt car ils seront installés automatiquement avec le package qui les requiert ... Donc, si vous ajoutez un nouveau package à votre virtualenv, vous devriez probablement simplement ajouter la ligne de ce package à votre requirements.txt...

Voir cet exemple:

(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

(Bien que je devrais probablement mentionner que dans la plupart des cas, cela ne fera pas de mal que vous ayez ces dépendances là-bas, juste votre fichier augmentera et deviendra plus difficile à maintenir.)

10
Bernhard Vallant

pipreqs résout le problème. Il génère au niveau du projet fichier required.txt.

  • Installez pipreqs: pip install pipreqs
  • Générez le fichier requirements.txt au niveau du projet: pipreqs /path/to/your/project/ le fichier d'exigences serait enregistré dans /path/to/your/project/requirements.txt
10
Haifeng Zhang

Vous pouvez utiliser les éléments suivants dans votre environnement virtuel

pip freeze -l > requirements.txt

Cela écrira les packages python qui se trouvent uniquement dans votre environnement virtuel.

0
ravikt