¿Cuál es la forma correcta de instalar pip, virtualenv y distribuir para Python?

Pregunta corta

  • ¿Cuál es la forma correcta de instalar pip , virtualenv y distribute ?

Fondo

En mi respuesta a la pregunta SO 4314376 , recomendé usar ez_setup para que luego pueda instalar pip y virtualenv siguiente manera:

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

Originalmente saqué estas instrucciones de la publicación del blog de Jesse Noller. ¿Así que quieres usar Python en la Mac? . Me gusta la idea de mantener un directorio de paquetes de sitio global limpio, por lo que los únicos otros paquetes que instalo son virtualenvwrapper y distribute . (Recientemente agregué distribute a mi caja de herramientas debido a este anuncio de servicio público de Python . Para instalar estos dos paquetes, utilicé:

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

No más setuptools y easy_install

Para seguir realmente ese anuncio de servicio público de Python , en una instalación nueva de Python, haría lo siguiente:

 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 

Reprensión de glifo

En un comentario a mi respuesta a la pregunta SO 4314376 , el usuario de Glyph declaró:

NO. NUNCA NUNCA realice sudo python setup.py install lo que sea. Escribe un ~ / .pydistutils.cfg que ponga tu instalación pip en ~ / .local o algo así. Especialmente los archivos con el nombre ez_setup.py tienden a absorber versiones más recientes de elementos como setuptools y easy_install, que potencialmente pueden romper otras cosas en su sistema operativo.

Volver a la pregunta corta

Así que la respuesta de Glyph me lleva a mi pregunta original:

  • ¿Cuál es la forma correcta de instalar pip , virtualenv y distribute ?

Puedes hacer esto sin instalar nada en Python.

No necesitas sudo ni ningún privilegio.

No necesitas editar ningún archivo.

Instale virtualenv en un entorno virtual bootstrap. Utiliza ese entorno virtual para crear más. Como virtualenv se envía con pip y distribuye, obtiene todo de una instalación.

  1. Descargar virtualenv:
  2. Desempaquetar la fuente tarball
  3. Utilice el tarball desempaquetado para crear un entorno virtual limpio. Este entorno virtual se utilizará para “arrancar” a otros. Todos sus entornos virtuales contendrán automáticamente pip y distribuir.
  4. Usando pip, instale virtualenv en ese entorno bootstrap.
  5. Utilice ese entorno bootstrap para crear más!

Aquí hay un ejemplo 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 

Ahora puedes usar tu entorno “bootstrap” para crear más:

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

¡Vete loco!

Nota

Esto supone que no está utilizando una versión realmente antigua de virtualenv. Las versiones anteriores requerían los indicadores --no-site-packges (y, dependiendo de la versión de Python, --distribute ). Ahora puede crear su entorno bootstrap con solo python virtualenv.py path-to-bootstrap o python3 virtualenv.py path-to-bootstrap .

Creo que Glyph significa hacer algo como esto:

  1. Cree un directorio ~/.local , si aún no existe.
  2. En su ~/.bashrc , asegúrese de que ~/.local/bin esté en PATH y que ~/.local esté en PYTHONPATH .
  3. Cree un archivo ~/.pydistutils.cfg que contenga

     [install] prefix=~/.local 

    Es un archivo estándar de formato ConfigParser.

  4. Descarga distribute_setup.py y ejecuta python distribute_setup.py (no sudo ). Si se queja sobre un directorio de site-packages no existente, créelo manualmente:

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

  5. Ejecute which easy_install para verificar que proviene de ~/.local/bin

  6. Ejecutar pip install virtualenv
  7. Ejecutar pip install virtualenvwrapper
  8. Cree una carpeta que contenga env virtual, diga ~/.virtualenvs
  9. En ~/.bashrc añadir

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

Eso es todo, no uso de sudo en absoluto y su entorno Python está en ~/.local , completamente separado de Python del sistema operativo. Descargo de responsabilidad: no estoy seguro de la compatibilidad virtualenvwrapper en este escenario; no pude probarlo en mi sistema 🙂

Si sigue los pasos recomendados en varios tutoriales que vinculé en esta respuesta , puede obtener el efecto deseado sin los pasos “manuales” un tanto complicados en las respuestas de Walker y Vinay. Si estás en Ubuntu:

 sudo apt-get install python-pip python-dev 

El equivalente se logra en OS X usando homebrew para instalar python (más detalles aquí ).

 brew install python 

Con pip instalado, puedes usarlo para obtener los paquetes restantes (puedes omitir sudo en OS X, ya que estás usando la instalación local de Python).

 sudo pip install virtualenvwrapper 

(estos son los únicos paquetes que necesita que se instalen globalmente y dudo que entren en conflicto con cualquier sistema del sistema operativo. Si desea ser súper seguro, puede mantener las versiones de la distro sudo apt-get install virtualenvwrapper )

Nota: en Ubuntu 14.04 recibo algunos errores con pip install , así que uso pip3 install virtualenv virtualenvwrapper y agrego VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 a mi archivo .bashrc/.zshrc .

A continuación, agregue a su archivo .bashrc

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

y la fuente

 . ~/.bashrc 

Esto es básicamente eso. Ahora, la única decisión es si desea crear un virtualenv para incluir paquetes a nivel de sistema

 mkvirtualenv --system-site-packages foo 

donde no es necesario reinstalar los paquetes de su sistema existente, están vinculados a las versiones del intérprete del sistema. Nota: aún puede instalar nuevos paquetes y actualizar los paquetes incluidos desde el sistema sin sudo; lo probé y funciona sin interrupciones del intérprete del sistema.

 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 

La alternativa, si quieres un entorno completamente separado, es

 mkvirtualenv --no-site-packages bar 

o dado que esta es la opción por defecto, simplemente

 mkvirtualenv bar 

El resultado es que tiene un nuevo virtualenv donde puede instalar sus paquetes favoritos de forma libre y sin errores.

 pip install flask 

Python 3.4 en adelante

Python 3.3 agrega el módulo venv , y Python 3.4 agrega el módulo ensurepip . Esto hace que bootprapping pip sea tan fácil como:

python -m ensurepip

Quizás precedido por una llamada a venv para hacerlo dentro de un entorno virtual.

El pip garantizado se describe en PEP 453 .

En Ubuntu:

sudo apt-get install python-virtualenv

El paquete python-pip es una dependencia, por lo que también se instalará.

Hice este procedimiento para que lo usemos en el trabajo.

 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. 

Puntos clave para la seguridad:

  1. curl hace validación ssl. wget no lo hace
  2. A partir de la pip 1.3.1, pip también hace la validación ssl.
  3. Menos usuarios pueden cargar el tarball pypi que un tarball github.

Actualización: A partir de julio de 2013 este proyecto ya no se mantiene. El autor sugiere usar pyenv . (Pyenv no tiene soporte incorporado para virtualenv, pero juega bien con él).

Pythonbrew es un administrador de versiones para python y viene con soporte para virtualenv.

Después de instalar pythonbrew y una versión de python usando venvs es realmente fácil:

 # Initializes the virtualenv pythonbrew venv init # Create a virtual/sandboxed environment pythonbrew venv create mycoolbundle # Use it pythonbrew venv use mycoolbundle 

No hay problema para hacer sudo python setup.py install, si estás seguro de que es lo que quieres hacer.

La diferencia es que utilizará el directorio site-packages de su sistema operativo como destino para copiar los archivos .py.

Por lo tanto, si quieres que pip sea accesible al ancho, probablemente ese sea el camino a seguir. No digo que los demás sean malos, pero probablemente sea lo suficientemente justo.

Instalar ActivePython . Incluye pip, virtualenv y Distribute.

Me encontré con el mismo problema recientemente. Me estoy volviendo más parcial a la mentalidad de “usar siempre un virtualenv”, por lo que mi problema fue instalar virtualenv con pip sin instalar, distribuir a mi directorio global o usuario de paquetes de sitios. Para hacer esto, descargué manualmente distribuir, pip y virtualenv, y para cada uno ejecuté “python setup.py install –prefix ~ / .local / python-private” (con una configuración temporal de PYTHONPATH = ~ / .local / python-private) para que los scripts de configuración pudieran encontrar distribuir). He movido el script virtualenv a otro directorio que tengo en mi RUTA y lo edité para que los módulos de distribución y virtualenv se puedan encontrar en sys.path. Tada: No instalé nada en / usr, / usr / local ni en mi directorio de paquetes de usuario, pero puedo ejecutar virtualenv en cualquier lugar, y en ese virtualenv obtengo pip.

He tenido varios problemas (ver más abajo) al instalar módulos SSL actualizados, incluso dentro de un virtualenv, además de las versiones antiguas de Python provistas por el sistema operativo, así que ahora uso pyenv .

pyenv hace que sea muy fácil instalar nuevas versiones de Python y es compatible con virtualenvs. Comenzar es mucho más fácil que las recetas para virtualenv enumeradas en otras respuestas:

  • En Mac, escriba brew install pyenv y en Linux, use pyenv-installer
  • esto le permite tener soporte virtualenv incorporado, así como el cambio de versión de Python (si es necesario)
  • funciona bien con Python 2 o 3, puede tener muchas versiones instaladas a la vez

Esto funciona muy bien para aislar la versión “new Python” y virtualenv del sistema Python. Debido a que puede usar un Python más reciente (post 2.7.9), los módulos SSL ya están actualizados y, por supuesto, como cualquier configuración virtualenv moderna, está aislado de los módulos Python del sistema.

Un par de buenos tutoriales:

  • Uso de pyenv y virtualenv : al seleccionar una versión de Python, es más fácil usar pyenv global 3.6.1 (global al usuario actual) o pyenv local 2.7.13 (local al directorio actual).
  • Conceptos básicos de pyenv y uso con virtualenv.

El pyenv-virtualenv ahora está integrado en – escriba pyenv commands | grep virtualenv pyenv commands | grep virtualenv para comprobar. No usaría el plugin pyenv-virtualenvwrapper para comenzar; vea cómo le va con pyenv-virtualenv, que está más integrado en pyenv, ya que cubre la mayor parte de lo que hace virtualenvwrapper.

pyenv se basa en rbenv (una buena herramienta para el cambio de versión de Ruby) y su única dependencia es bash.

  • pyenv no está relacionado con el nombre muy similar de pyvenv , que es un equivalente pyvenv que forma parte de las versiones recientes de Python 3, y no controla el cambio de versión de Python

Advertencias

Dos advertencias sobre pyenv:

  1. Solo funciona desde un shell bash o similar, o más específicamente, al complemento pyenv-virtualenv no le gusta el dash , que es /bin/sh en Ubuntu o Debian.
  2. Debe ejecutarse desde un shell de inicio de sesión interactivo (por ejemplo, bash --login usando un terminal), lo que no siempre es fácil de lograr con herramientas de automatización como Ansible .

Por lo tanto, pyenv es mejor para uso interactivo y menos bueno para servidores de scripting.

Problemas del módulo SSL

Una razón para usar pyenv es que a menudo hay problemas con la actualización de los módulos SSL de Python al usar versiones anteriores de Python proporcionadas por el sistema:

  • Ubuntu 14.04 incluye Python 2.7.6 que requiere un esfuerzo considerable para actualizarlo a los módulos SSL correctos para que maneje SNI (indicación del nombre del servidor) como cliente. (Escribí algunos scripts de Ansible para esto, que fueron bastante dolorosos y aún se rompieron en algunos casos).
  • los módulos SSL actualizados serán más importantes a medida que los sitios de Python.org se muevan a TLS 1.2 solo durante 2017 y 2018.
  • Puedes hacer esto sin instalar nada en Python.

  • No necesitas sudo ni ningún privilegio.

  • No es necesario encontrar la última versión de un archivo tar virtualenv

  • No es necesario editar la información de la versión en un script de bash para mantener las cosas actualizadas.

  • No necesitas tener instalado curl / wget o tar , ni pip o easy_install

  • esto funciona tanto para 2.7 como para 3.X

Guarde lo siguiente en /tmp/initvenv.py :

de la importación de la función de impresión

 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 

y usarlo como

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

por ejemplo (si realmente necesita la capa de compatibilidad de distribute para setuptools )

 python /tmp/initvenv.py venv distribute 

Tenga en cuenta que, con versiones anteriores de python, esto podría proporcionarle InsecurePlatformWarning s¹.

Una vez que tenga su virtualenv (nombre, por ejemplo, venv ), puede configurar otro virtualenv utilizando el virtualenv acaba de instalar:

 venv/bin/virtualenv venv2 

virtualenvwrapper

También recomiendo echar un vistazo a virtualenvwrapper , después de una configuración única:

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

y activación (se puede hacer desde su script de inicio de sesión):

 % source venv/bin/virtualenvwrapper.sh 

puedes hacer cosas como

 % 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)% 

¹ No he encontrado una manera de suprimir la advertencia. Podría resolverse en pip y / o request , pero los desarrolladores apuntan entre sí como la causa. Recibí la recomendación, a menudo no realista, de actualizar la versión de python que estaba usando a la última versión. Estoy seguro de que esto se rompería, por ejemplo, mi instalación de Linux Mint 17. Afortunadamente, los paquetes de caché de pip , por lo que la Advertencia se hace solo una vez por instalación de paquete.

Hay buenas instrucciones en el sitio oficial de Virtualenv. https://pypi.python.org/pypi/virtualenv

Básicamente, lo que hice fue instalar pip con sudo easy_install pip , luego usar sudo pip install virtualenv luego crear un entorno con: virtualenv my_env (nombre que quieras), siguiendo lo que hice: virtualenv --distribute my_env ; Que instalé distribute y pip en mi virtualenv.

Una vez más, siga las instrucciones en la página virtualenv .

Una especie de molestia, viniendo de Ruby; P

Esta es una buena manera de instalar virtualenvwrapper (actualización de esto ).

Descargue virtualenv-1.11.4 (puede encontrar las últimas noticias aquí ), descomprímalo, abra el terminal

 # Create a bootstrapenv and activate it: $ cd ~ $ python /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 

Eso es todo, ahora puedes usar mkvirtualenv env1 , lsvirtualenv ..etc

Nota: puede eliminar virtualenv-1.11.4 y virtualenv-1.11.4.zip de las carpetas de descargas.

La buena noticia es que si ha instalado python3.4, ya se ha instalado pyvenv. Por lo que sólo

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

Ahora en este entorno virtual, puede usar pip para instalar módulos para este proyecto.

Deja este env virtual, solo

 deactivate