web-dev-qa-db-fra.com

Quelle est la bonne façon d'installer pip, virtualenv et distribuer pour Python?

Question courte

Contexte

Dans ma réponse à SO question 4314376 , j'ai recommandé d'utiliser ez_setup afin que vous puissiez ensuite installer pip et virtualenv comme suit:

curl -O http://peak.telecommunity.com/dist/ez_setup.py
Sudo python ez_setup.py
Sudo easy_install pip
Sudo pip install virtualenv

À l'origine, j'ai extrait ces instructions du billet de blog de Jesse Noller . Vous voulez donc utiliser Python sur Mac? . J'aime l'idée de conserver un répertoire site-packages global propre, de sorte que les seuls packages que j'installe sont virtualenvwrapper et distribute . (J'ai récemment ajouté distribute à ma boîte à outils à cause de ceci Python annonce de service public . Pour installer ces deux paquets, j'ai utilisé:

Sudo pip install virtualenvwrapper
curl -O http://python-distribute.org/distribute_setup.py
Sudo python distribute_setup.py

Plus de setuptools et easy_install

Pour vraiment suivre que Python annonce de service public , sur une nouvelle installation Python, je procéderais comme suit: :

curl -O http://python-distribute.org/distribute_setup.py
Sudo python distribute_setup.py
Sudo easy_install pip
Sudo pip install virtualenv
Sudo pip install virtualenvwrapper

La réprimande du glyphe

Dans un commentaire à ma réponse à SO question 4314376 , SO utilisateur Glyph a déclaré:

NON. JAMAIS JAMAIS Sudo python setup.py install quoi que ce soit. Ecrivez un fichier ~/.pydistutils.cfg qui place votre installation de pip dans ~/.local ou quelque chose du genre. En particulier, les fichiers nommés ez_setup.py tendent à engloutir les versions les plus récentes d'éléments tels que setuptools et easy_install, qui peuvent potentiellement endommager d'autres éléments de votre système d'exploitation.

Retour à la question courte

Donc la réponse de Glyph m'amène à ma question initiale:

245
Matthew Rankin

Vous pouvez le faire sans rien installer dans python lui-même.

Vous n'avez pas besoin de Sudo ni de privilèges.

Vous n'avez pas besoin de modifier aucun fichier.

Installez virtualenv dans un environnement virtuel bootstrap. Utilisez l'environnement virtuel pour en créer davantage. Depuis que virtualenv est livré avec pip et distribution, vous obtenez tout en une installation.

  1. Télécharger virtualenv:
  2. Décompressez l'archive source
  3. Utilisez l’archive tar décompressée pour créer un environnement virtuel propre. Cet environnement virtuel sera utilisé pour "amorcer" d'autres personnes. Tous vos environnements virtuels contiendront automatiquement pip et distribution.
  4. A l’aide de pip, installez virtualenv dans cet environnement bootstrap.
  5. Utilisez cet environnement bootstrap pour en créer davantage!

Voici un exemple en bash:

# Select current version of virtualenv:
VERSION=12.0.7
# Name your first "bootstrap" environment:
INITIAL_ENV=bootstrap
# Set to whatever python interpreter you want for your first environment:
PYTHON=$(which python)
URL_BASE=https://pypi.python.org/packages/source/v/virtualenv

# --- Real work starts here ---
curl -O $URL_BASE/virtualenv-$VERSION.tar.gz
tar xzf virtualenv-$VERSION.tar.gz
# Create the first "bootstrap" environment.
$PYTHON virtualenv-$VERSION/virtualenv.py $INITIAL_ENV
# Don't need this anymore.
rm -rf virtualenv-$VERSION
# Install virtualenv into the environment.
$INITIAL_ENV/bin/pip install virtualenv-$VERSION.tar.gz

Maintenant, vous pouvez utiliser votre environnement "bootstrap" pour en créer plus:

# Create a second environment from the first:
$INITIAL_ENV/bin/virtualenv py-env1
# Create more:
$INITIAL_ENV/bin/virtualenv py-env2

Devenir fou!

Remarque

Cela suppose que vous n'utilisez pas une version très ancienne de virtualenv. Les anciennes versions nécessitaient les indicateurs --no-site-packges (et, selon la version de Python, --distribute). Vous pouvez maintenant créer votre environnement bootstrap avec juste python virtualenv.py path-to-bootstrap ou python3 virtualenv.py path-to-bootstrap.

173
Walker Hale IV

Je pense que Glyph signifie faire quelque chose comme ceci:

  1. Créez un répertoire ~/.local, s'il n'existe pas déjà.
  2. Dans votre ~/.bashrc, assurez-vous que ~/.local/bin est sur PATH et que ~/.local est sur PYTHONPATH.
  3. Créez un fichier ~/.pydistutils.cfg qui contient

    [install]
    prefix=~/.local
    

    C'est un fichier standard au format ConfigParser.

  4. Téléchargerdistribute_setup.py et exécuter python distribute_setup.py (no Sudo). S'il se plaint d'un répertoire site-packages non existant, créez-le manuellement:

    mkdir -p ~/.local/lib/python2.7/site-packages /

  5. Exécutez which easy_install pour vérifier qu'il provient bien de ~/.local/bin

  6. Exécuter pip install virtualenv
  7. Exécuter pip install virtualenvwrapper
  8. Créez un dossier contenant un env virtuel, par exemple ~/.virtualenvs
  9. Dans ~/.bashrc add

    export WORKON_HOME
    source ~/.local/bin/virtualenvwrapper.sh
    

Ça y est, aucune utilisation de Sudo et votre environnement Python est dans ~/.local, complètement séparé de Python du système d'exploitation. Clause de non-responsabilité: Je ne suis pas sûr de la compatibilité de virtualenvwrapper dans ce scénario - je n’ai pas pu le tester sur mon système :-)

21
Vinay Sajip

Si vous suivez les étapes conseillées dans plusieurs tutoriels auxquels j'ai lié cette réponse , vous pouvez obtenir l'effet souhaité sans les étapes "manuelles" quelque peu compliquées des réponses de Walker et Vinay. Si vous êtes sur Ubuntu:

Sudo apt-get install python-pip python-dev

L'équivalent est obtenu sous OS X en utilisant homebrew pour installer python (plus de détails ici ).

brew install python

Avec pip installé, vous pouvez l’utiliser pour récupérer les derniers paquets (vous pouvez omettre Sudo dans OS X, car vous utilisez votre installation locale python).

Sudo pip install virtualenvwrapper

(Ce sont les seuls packages dont vous avez besoin d'être installés globalement et je doute qu'il se heurte à quoi que ce soit au niveau du système depuis le système d'exploitation. Si vous voulez être super sûr, vous pouvez conserver les versions de la distribution Sudo apt-get install virtualenvwrapper)

Remarque: sous Ubuntu 14.04, je reçois quelques erreurs avec pip install , donc j'utilise pip3 install virtualenv virtualenvwrapper et ajoute VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 dans mon fichier .bashrc/.zshrc.

Vous ajoutez ensuite à votre fichier .bashrc

export WORKON_HOME
source /usr/local/bin/virtualenvwrapper.sh

et le source

. ~/.bashrc

C'est fondamentalement ça. Maintenant, la seule décision est de savoir si vous voulez créer un virtualenv pour inclure des packages au niveau du système

mkvirtualenv --system-site-packages foo

là où vos packages système existants ne doivent pas être réinstallés, ils sont liés symboliquement aux versions de l'interpréteur système. Remarque: vous pouvez toujours installer de nouveaux packages et mettre à niveau les packages inclus du système existants sans Sudo. Je l'ai testé et il fonctionne sans interruption de l'interpréteur système.

Kermit@hocus-pocus:~$ Sudo apt-get install python-pandas
Kermit@hocus-pocus:~$ mkvirtualenv --system-site-packages s
(s)Kermit@hocus-pocus:~$ pip install --upgrade pandas
(s)Kermit@hocus-pocus:~$ python -c "import pandas; print(pandas.__version__)"
0.10.1
(s)Kermit@hocus-pocus:~$ deactivate
Kermit@hocus-pocus:~$ python -c "import pandas; print(pandas.__version__)"
0.8.0

L'alternative, si vous voulez un environnement complètement séparé, est

mkvirtualenv --no-site-packages bar

ou étant donné que c'est l'option par défaut, simplement

mkvirtualenv bar

Le résultat est que vous avez un nouveau virtualenv où vous pouvez installer librement et rapidement vos paquets préférés

pip install flask
16
metakermit

Python 3.4 et plus

Python 3.3 ajoute le module venv , et Python 3.4 ajoute le module Ensurepip . Cela rend l'amorçage pip aussi simple que:

python -m Ensurepip

Peut-être précédé d'un appel à venv pour le faire dans un environnement virtuel.

Le pip garanti est décrit dans PEP 45 .

12
gerrit

Sur Ubuntu:

Sudo apt-get install python-virtualenv

Le paquet python-pip est une dépendance, il sera donc également installé.

10
Arik Halperin

J'ai conçu cette procédure pour que nous l'utilisions au travail.

cd ~
curl -s https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz | tar xvz
cd pip-1.3.1
python setup.py install --user
cd ~
rm -rf pip-1.3.1

$HOME/.local/bin/pip install --user --upgrade pip distribute virtualenvwrapper

# Might want these three in your .bashrc
export PATH=$PATH:$HOME/.local/bin
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS="--distribute"
source $HOME/.local/bin/virtualenvwrapper.sh

mkvirtualenv mypy
workon mypy
pip install --upgrade distribute
pip install pudb # Or whatever other Nice package you might want.

Points clés pour les soucieux de la sécurité:

  1. curl fait la validation ssl. wget pas.
  2. À partir de pip 1.3.1, pip effectue également la validation SSL.
  3. Moins d'utilisateurs peuvent télécharger l'archive pypi que l'archive github.
5
bukzor

Mise à jour: Depuis juillet 2013, ce projet n'est plus mis à jour. L'auteur suggère d'utiliser pyenv . (pyenv ne prend pas en charge virtualenv, mais joue à Nice avec.)

Pythonbrew est un gestionnaire de version pour python et est fourni avec le support de virtualenv.

Après avoir installé pythonbrew et une version python avec venvs, c’est très simple:

# Initializes the virtualenv 
pythonbrew venv init

# Create a virtual/sandboxed environment 
pythonbrew venv create mycoolbundle  

# Use it 
pythonbrew venv use mycoolbundle
5
kioopi

Il n’ya aucun problème à faire Sudo python setup.py installer, si vous êtes sûr que c’est ce que vous voulez faire.

La différence est qu’il utilisera le répertoire site-packages de votre système d’exploitation comme destination des fichiers .py à copier.

donc, si vous voulez que pip soit accessible à une large échelle, c'est probablement la voie à suivre. Je ne dis pas que les autres manières sont mauvaises, mais c'est probablement assez juste.

3
Alexis Métaireau

Installez ActivePython . Il comprend pip, virtualenv et Distribute.

3
Sridhar Ratnakumar
  • Vous pouvez le faire sans rien installer dans python lui-même.

  • Vous n'avez pas besoin de Sudo ni de privilèges.

  • Vous n'avez pas besoin de trouver la dernière version d'un fichier tar virtualenv

  • Vous n'avez pas besoin de modifier les informations de version dans un script bash pour maintenir les informations à jour.

  • Vous n'avez pas besoin de curl/wget ou tar ni de pip ou easy_install

  • cela fonctionne pour 2.7 ainsi que pour 3.X

Enregistrez les éléments suivants dans /tmp/initvenv.py:

depuis future import print_function

import os, sys, shutil, tempfile, subprocess, tarfile, hashlib

try:
    from urllib2 import urlopen
except ImportError:
    from urllib.request import urlopen

tmp_dir = tempfile.mkdtemp(prefix='initvenv_')
try:
    # read the latest version from PyPI
    f = urlopen("https://pypi.python.org/pypi/virtualenv/")
    # retrieve the .tar.gz file
    tar_found = False
    url = None
    sha256 = None
    for line in f.read().splitlines():
        if isinstance(line, bytes):
            line = line.decode('utf-8')
        if tar_found:
            if 'sha256' in line:
                sha256 = line.split('data-clipboard-text')[1].split('"')[1]
                break
            continue
        if not tar_found and 'tar.gz">' not in line:
            continue
        tar_found = True
        for url in line.split('"'):
            if url.startswith('https'):
                break
    else:
        print('tar.gz not found')
        sys.exit(1)
    file_name = url.rsplit('/', 1)[1]
    print(file_name)
    os.chdir(tmp_dir)
    data = urlopen(url).read()
    data_sha256 = hashlib.sha256(data).hexdigest()
    if sha256 != data_sha256:
        print('sha256 not correct')
        print(sha256)
        print(data_sha256)
        sys.exit(1)
    with open(file_name, 'wb') as fp:
        fp.write(data)
    tar = tarfile.open(file_name)
    tar.extractall()
    tar.close()
    os.chdir(file_name.replace('.tar.gz', ''))
    print(subprocess.check_output([sys.executable, 'virtualenv.py'] +
                                  [sys.argv[1]]).decode('utf-8'), end='')
    if len(sys.argv) > 2:
        print(subprocess.check_output([
            os.path.join(sys.argv[1], 'bin', 'pip'), 'install', 'virtualenv'] +

            sys.argv[2:]).decode('utf-8'), end='')
except:
    raise
finally:
    shutil.rmtree(tmp_dir)  # always clean up

et l'utiliser comme

python_binary_to_use_in_venv /tmp/initvenv.py your_venv_name [optional packages]

par exemple. (si vous avez vraiment besoin du calque de compatibilité distribute pour setuptools)

python /tmp/initvenv.py venv distribute

Veuillez noter que, avec les anciennes versions de python, ceci pourrait vous donner InsecurePlatformWarnings¹.

Une fois que vous avez votre virtualenv (nom, par exemple venv), vous pouvez configurer un autre virtualenv à l’aide du fichier virtualenv que vous venez d’installer:

venv/bin/virtualenv venv2

virtualenvwrapper

Je recommande de jeter un oeil à virtualenvwrapper également, après une configuration unique:

% /opt/python/2.7.10/bin/python /tmp/initvenv.py venv virtualenvwrapper

et activation (peut être effectué à partir de votre script de connexion):

% source venv/bin/virtualenvwrapper.sh

vous pouvez faire des choses comme:

% mktmpenv 
New python executable in tmp-17bdc3054a46b2b/bin/python
Installing setuptools, pip, wheel...done.
This is a temporary environment. It will be deleted when you run 'deactivate'.
(tmp-17bdc3054a46b2b)% 

¹ Je n'ai pas trouvé le moyen de supprimer l'avertissement. Cela pourrait être résolu dans pip et/ou request, mais les développeurs se désignent mutuellement comme étant la cause. J'ai reçu la recommandation, souvent peu réaliste, de mettre à niveau la version python que j'utilisais vers la dernière version. Je suis sûr que cela briserait par exemple mon installation de Linux Mint 17. Heureusement, pip met les paquets en cache, de sorte que l'avertissement est émis une seule fois par installation de paquet.

2
Anthon

Je suis tombé sur le même problème récemment. Je suis de plus en plus partisan de l’esprit "toujours utiliser un virtualenv". Mon problème était donc d’installer virtualenv avec pip sans installer la distribution dans mon répertoire global ou de packages de sites utilisateur. Pour ce faire, j'ai téléchargé manuellement les commandes distribution, pip et virtualenv. Pour chacune d’elles, j’ai exécuté "python setup.py install --prefix ~/.local/python-private" (avec un paramètre temporaire de PYTHONPATH = ~/.local/python-private) afin que les scripts d'installation puissent trouver la distribution). J’ai déplacé le script virtualenv vers un autre répertoire de mon chemin PATH et je l’ai édité de manière à ce que les modules de distribution et virtualenv soient disponibles sur sys.path. Tada: Je n'ai rien installé dans/usr,/usr/local ou dans mon répertoire site-packages utilisateur, mais je peux exécuter virtualenv n'importe où, et dans ce virtualenv, j'obtiens pip.

2
Éric Araujo

J'ai eu divers problèmes (voir ci-dessous) lors de l'installation de modules SSL mis à niveau, même à l'intérieur d'un environnement virtuel, par-dessus d'anciennes versions de Python fournies par le système d'exploitation. J'utilise donc maintenant pyenv.

pyenv facilite l'installation d'une nouvelle version de Python et prend en charge virtualenvs. La mise en route est beaucoup plus facile que les recettes de virtualenv listées dans d'autres réponses:

  • Sur Mac, tapez brew install pyenv et sous Linux, utilisez pyenv-installer
  • vous obtenez le support intégré de virtualenv ainsi que le changement de version Python (si nécessaire)
  • fonctionne bien avec Python 2 ou 3, plusieurs versions peuvent être installées à la fois

Cela fonctionne très bien pour isoler la version "nouvelle Python" et virtualenv du système Python. Comme vous pouvez facilement utiliser un Python plus récent (post 2.7.9), les modules SSL sont déjà mis à niveau et, bien entendu, comme toute configuration virtualenv moderne, vous êtes isolé du système Python modules.

Quelques tutoriels sympas:

Le plugin pyenv-virtualenv est maintenant intégré - tapez pyenv commands | grep virtualenv à vérifier. Pour commencer, je n’utiliserais pas le plug-in pyenv-virtualenvwrapper - vous verrez comment vous en sortez avec pyenv-virtualenv, qui est plus intégré dans pyenv, car il couvre la plupart des tâches de virtualenvwrapper.

pyenv est calqué sur rbenv (un bon outil pour le changement de version de Ruby) et sa seule dépendance est bash.

  • pyenv n’est pas lié au nom très similaire pyvenv - c’est un équivalent virtuel qui fait partie des versions récentes de Python 3 et ne gère pas le changement de version de Python

Mises en garde

Deux avertissements à propos de pyenv:

  1. Cela ne fonctionne que depuis un bash ou similaire, ou plus précisément, le plugin pyenv-virtualenv n'aime pas dash, qui est /bin/sh sous Ubuntu ou Debian.
  2. Il doit être exécuté à partir d'un shell de connexion interactif (par exemple bash --login à l'aide d'un terminal), ce qui n'est pas toujours facile à réaliser avec des outils d'automatisation tel que Ansible .

C'est pourquoi pyenv est le meilleur pour une utilisation interactive et moins bon pour les serveurs de script.

Problèmes liés au module SSL

Une des raisons d'utiliser pyenv est qu'il existe souvent des problèmes de mise à niveau des modules Python SSL lors de l'utilisation d'anciennes versions de Python fournies par le système:

2
RichVel

Il y a de bonnes instructions sur le site officiel de Virtualenv. https://pypi.python.org/pypi/virtualenv

Fondamentalement, ce que j’ai fait est d’installer pip avec Sudo easy_install pip, puis d’utiliser Sudo pip install virtualenv, puis de créer un environnement avec: virtualenv my_env (nommez-le comme vous voulez), en suivant ce que j’ai fait: virtualenv --distribute my_env; qui a installé distribute et pip dans mon virtualenv.

Encore une fois, suivez les instructions sur la page virtualenv.

Un genre de problème, venant de Ruby; P

0
Victor S

La bonne nouvelle est que si vous avez installé python3.4, pyvenv est déjà installé. Alors, juste

pyvenv project_dir
source project_dir/bin/activate
python --version   
python 3.4.*

Maintenant, dans cet env virtuel, vous pouvez utiliser pip pour installer des modules pour ce projet.

Quitter cet env virtuel, juste

deactivate
0
maoyang

Voici un bon moyen d'installer virtualenvwrapper (mise à jour de this ).

Téléchargez virtualenv-1.11.4 (vous pouvez trouver le dernier à ici ), décompressez-le, ouvrez terminal

# Create a bootstrapenv and activate it:
$ cd ~
$ python <path to unzipped folder>/virtualenv.py bootstrapenv
$ source bootstrapenv/bin/activate

# Install virtualenvwrapper:
$ pip install virtualenvwrapper
$ mkdir -p ~/bootstrapenv/Envs

# append it to file `.bashrc`
$ vi ~/.bashrc
  source ~/bootstrapenv/bin/activate
  export WORKON_HOME=~/bootstrapenv/Envs
  source ~/bootstrapenv/bin/virtualenvwrapper.sh

# run it now.
$ source ~/.bashrc

Voilà, vous pouvez maintenant utiliser mkvirtualenv env1, lsvirtualenv ..etc

Remarque: vous pouvez supprimer virtualenv-1.11.4 et virtualenv-1.11.4.Zip des dossiers Téléchargements.

0
suhailvs