python - make - venv y virtualenv
¿Cuál es la forma correcta de instalar pip, virtualenv y distribuir para Python? (15)
Esta es una buena manera de instalar virtualenvwrapper (actualización de this ).
Descargue virtualenv-1.11.4 (puede encontrar las últimas noticias here ), descomprímalo, abra el 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
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.
Pregunta corta
- ¿Cuál es la forma correcta de instalar
pip
,virtualenv
ydistribute
?
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 SO Glyph dijo:
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 nombreez_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
ydistribute
?
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 bootstrapping pip sea tan fácil como:
python -m ensurepip
Tal vez precedido por una llamada a venv
para hacerlo dentro de un entorno virtual.
El pip garantizado se describe en PEP 453 .
Creo que Glyph significa hacer algo como esto:
- Cree un directorio
~/.local
, si aún no existe. - En su
~/.bashrc
, asegúrese de que~/.local/bin
esté enPATH
y que~/.local
esté enPYTHONPATH
. Cree un archivo
~/.pydistutils.cfg
que contenga[install] prefix=~/.local
Es un archivo estándar de formato ConfigParser.
Download
distribute_setup.py
y ejecutapython distribute_setup.py
(nosudo
). Si se queja sobre un directorio desite-packages
no existente, créelo manualmente:mkdir -p ~ / .local / lib / python2.7 / site-packages /
Ejecute
which easy_install
para verificar que proviene de~/.local/bin
- Ejecutar
pip install virtualenv
- Ejecutar
pip install virtualenvwrapper
- Cree una carpeta que contenga env virtual, diga
~/.virtualenvs
En
~/.bashrc
añadirexport 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 :-)
En Ubuntu:
sudo apt-get install python-virtualenv
El paquete python-pip
es una dependencia, por lo que también se instalará.
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 usé sudo pip install virtualenv
luego creamos un entorno con: virtualenv my_env
( virtualenv my_env
como quiera), 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
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 proporcionadas por el sistema operativo, por lo que ahora uso pyenv
.
pyenv hace que sea muy fácil instalar una nueva versión de Python y soporta 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 brinda soporte virtual en virtual 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) opyenv 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 equivalentepyvenv
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:
- 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. - Debe ejecutarse desde un shell de inicio de sesión interactivo (por ejemplo,
bash --login
usando un terminal), 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 cuando se usan versiones antiguas 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 están dañados 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.
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 mentalidad de seguridad:
- Curl hace validación ssl. wget no lo hace
- A partir de la pip 1.3.1, pip también hace la validación ssl.
- Menos usuarios pueden cargar el tarball pypi que un tarball github.
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
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 PATH 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 o mi directorio de paquetes de usuario, pero puedo ejecutar virtualenv en cualquier lugar, y en ese virtualenv obtengo pip.
No hay ningún 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.
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.
- Descargar virtualenv:
- http://pypi.python.org/pypi/virtualenv
- https://pypi.python.org/packages/source/v/virtualenv/virtualenv-12.0.7.tar.gz (¡o la versión más reciente!)
- Desempaquetar la fuente tarball
- Use 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.
- Usando pip, instale virtualenv en ese entorno de arranque.
- 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 las banderas --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
.
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 here ).
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
Instalar ActivePython . Incluye pip, virtualenv y Distribute.
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
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 instalar
curl
/wget
otar
, nipip
oeasy_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 futura
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.