python - update - virtualenv--no-site-packages y pip aún encuentran paquetes globales?
virtualenv python windows (11)
Tenía la impresión de que virtualenv --no-site-packages crearía un entorno Python completamente separado y aislado, pero parece que no.
Por ejemplo, tengo python-django instalado globalmente, pero deseo crear un virtualenv con una versión diferente de Django.
$ virtualenv --no-site-packages foo
New python executable in foo/bin/python
Installing setuptools............done.
$ pip -E foo install Django
Requirement already satisfied: Django in /usr/share/pyshared
Installing collected packages: Django
Successfully installed Django
Por lo que puedo decir, se supone que la pip -E foo install
anterior de pip -E foo install
debe volver a instalar una nueva versión de Django. Además, si le digo a pip que congele el ambiente, obtengo muchos paquetes. Esperaría que para un ambiente fresco con --no-site-packages esto estaría en blanco?
$ pip -E foo freeze
4Suite-XML==1.0.2
BeautifulSoup==3.1.0.1
Brlapi==0.5.3
BzrTools==1.17.0
Django==1.1
... and so on ...
¿Entiendo mal cómo se supone que --no-site-packages funciona?
Aquí está la lista de todas las options instalación de pip: no encontré ninguna opción '' -E
'', puede ser una versión anterior. A continuación, comparto un uso sencillo en inglés y el funcionamiento de virtualenv
para los próximos usuarios de SO.
Todo parece bien, acepte activar el virtualenv
( foo
). Todo lo que hace es permitirnos tener múltiples (y variados) entornos Python, es decir, varias versiones de Python o varias versiones de Django, o cualquier otro paquete de Python, en caso de que tengamos una versión anterior en producción y desee probar la última versión de Django con nuestro solicitud.
En pocas palabras, crear y usar (activar) un entorno virtual ( virtualenv
) hace posible ejecutar o probar nuestra aplicación o simples scripts de Python con diferentes intérpretes de Python, es decir, Python 2.7 y 3.3: puede ser una instalación nueva (usando --no-site-packages
opción) o todos los paquetes de la configuración existente / última (usando la --system-site-packages
). Para usarlo tenemos que activarlo:
$ pip install django
lo instalará en los paquetes de sitio globales, y de manera similar obtener el pip freeze
dará los nombres de los paquetes de sitio globales.
mientras que dentro de venv dir (foo) ejecutando $ source /bin/activate
se activará venv, es decir, ahora cualquier cosa instalada con pip solo se instalará en el entorno virtual, y solo ahora la congelación de pip no dará la lista de paquetes de sitio globales python paquetes. Una vez activado:
$ virtualenv --no-site-packages foo
New python executable in foo/bin/python
Installing setuptools............done.
$ cd foo
$ source bin/activate
(foo)$ pip install django
(foo)
antes de que el signo $
indique que estamos usando un entorno python virtual, es decir, cualquier cosa con pip - install, freeze, uninstall estará limitada a este venv, y no tendrá efecto en la instalación / paquetes globales / predeterminados de Python.
Debes asegurarte de que estás ejecutando el binario pip
en el entorno virtual que creaste, no el global.
env/bin/pip freeze
Ver una prueba:
Creamos virtualenv con la --no-site-packages
:
$ virtualenv --no-site-packages -p /usr/local/bin/python mytest
Running virtualenv with interpreter /usr/local/bin/python
New python executable in mytest/bin/python
Installing setuptools, pip, wheel...done.
Verificamos la salida de freeze
del pip
recién creado:
$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0
Pero si usamos el pip
global, esto es lo que obtenemos:
$ pip freeze
...
pyxdg==0.25
...
range==1.0.0
...
virtualenv==13.1.2
Es decir, todos los paquetes que pip
han instalado en todo el sistema. Al verificar which pip
obtenemos (al menos en mi caso) algo como /usr/local/bin/pip
, lo que significa que cuando hacemos pip freeze
llamamos a este binario en lugar de a mytest/bin/pip
.
Estaba teniendo el mismo problema. El problema para mí (en Ubuntu) fue que mi nombre de ruta contenía $
. Cuando creé un virtualenv fuera del $ dir, funcionó bien.
Extraño.
Esto también parece suceder cuando mueve el directorio virtualenv a otro directorio (en Linux) o cambia el nombre de un directorio padre.
Finalmente, descubrí que, por la razón que sea, pip -E no funcionaba. Sin embargo, si realmente activo el virtualenv, y uso easy_install proporcionado por virtualenv para instalar pip, entonces use pip directamente desde adentro, parece funcionar como se espera y solo muestra los paquetes en el virtualenv
Juniper tenía la respuesta.
Despeje la PYTHONPATH con:
export PYTHONPATH=
Luego crea y activa el entorno virtual:
virtualenv foo
. foo/bin/activate
Sólo entonces:
pip freeze
Sé que esta es una pregunta muy antigua, pero para quienes llegan aquí en busca de una solución:
No te olvides de activar el virtualenv ( source bin/activate
) antes de ejecutar la pip freeze
. De lo contrario, obtendrá una lista de todos los paquetes globales.
Tuve un problema como este, hasta que me di cuenta de que (mucho antes de haber descubierto virtualenv), había ido agregando directorios a PYTHONPATH en mi archivo .bashrc. Como había pasado más de un año antes, no pensé en eso de inmediato.
Un problema similar puede ocurrir en Windows si llama scripts directamente como script.py
que luego usa el abridor predeterminado de Windows y abre Python fuera del entorno virtual. Llamar con python script.py
usará Python con el entorno virtual.
Una de las razones posibles por las que virtualenv pip no funcionará es si alguna de las carpetas principales tenía espacio en su nombre /Documents/project name/app
renombrarla a /Documents/projectName/app
resuelve el problema.
--no-site-packages
debería, como su nombre indica, eliminar el directorio estándar de paquetes de sitio de sys.path. Cualquier otra cosa que viva en el camino de Python estándar permanecerá allí.