2011-06-19 21 views
18

Tengo varias versiones de python instaladas en mi Mac usando Macports. Cuando selecciono Python 2.7 a través de $ port select python python27, virtualenvwrapper funciona perfectamente.Usando diferentes versiones de python con virtualenvwrapper

Pero si selecciono otra versión del pitón, es decir, 2,6, virtualenvwrapper genera un mensaje de error: ImportError: Sin módulo denominado virtualenvwrapper.hook_loader

Revisé mi .profile y su ajuste a VIRTUALENVWRAPPER_PYTHON/opt/local/bin/python, por lo que parece me virtualenvwrapper debería funcionar independientemente de la pitón que he seleccionado.

¿Alguna idea de qué causaría que virtualenvwrapper genere un error .hook_loader cuando cambio las versiones de Python?

+8

Sin pasar por el puerto '' seleccione ... y quedarse con su base 2.7, se limita a ejecutar 'mkvirtualenv --python/ruta de trabajo/a/python2.6'? Debe cambiar automáticamente a (y configurar el entorno con) el intérprete correcto. En mi sistema (configurado con homebrew), 'mkvirtualenv -p python2.6' funciona bien. –

+0

No recibo el error hook_loader, pero se está quejando por la falta de DEST_DIR $ mkvirtualenv --python /opt/local/bin/python2.7 Ejecutando virtualenv con el intérprete /opt/local/bin/python2.7 Debe proporcione un DEST_DIR – wmfox3

+1

Vaya, perdón - ¡omitió el argumento clave! Debería ser 'mkvirtualenv --python /path/to/python2.6 env_name'. mkvirtualenv crea una carpeta llamada "env_name" en tu '$ WORKON_HOME', que se pasa a virtualenv como su argumento' DEST_DIR'. Sin especificar un nombre, sería difícil determinar dónde configurar las cosas, eso es seguro. –

Respuesta

19

Sé que esto es más o menos resuelto en sus comentarios, pero es mac solamente,

y aún más creo que la forma correcta debe ser fijar VIRTUALENVWRAPPER_PYTHON a la pitón real de que está utilizando en la línea de comandos.

Para asegurarse de que puede hacer which python.

De hecho, incluso se puede hacer:

export VIRTUALENVWRAPPER_PYTHON=`which python` 

En Linux hago esto en mi .bashrc, así que en general, asumiendo que ha instalado virtualenv y creó su primera "entorno virtual" virtualenv (qué original)

. virtualenv/bin/activate 
export WORKON_HOME=$HOME/.virtualenvs # or whatever else you want 
export VIRTUALENVWRAPPER_PYTHON=`which python` 
export PROJECT_HOME=SOMETHING 
source $HOME/virtualenv/bin/virtualenvwrapper.sh # or wherever else you got that installed 

(y por cierto, que escribió:

I checked my .profile and it's setting VIRTUALENVWRAPPER_PYTHON to /opt/local/bin/python, so it seems to me virtualenvwrapper should work regardless of which python I've selected

WHI ch es realmente lo opuesto: virtualenv depende del uso del python correcto (y de los paquetes que lo acompañan), por lo que es muy importante establecer el camino de python en consecuencia.

¡Incluso ejecutar un archivo py con un "#!/Bin/python" puede traer problemas una vez que esté virtualenved!

+4

Ejecutando algunas pruebas en mi Mac: parece que 'VIRTUALENVWRAPPER_PYTHON' solo controla qué ejecutable de Python utiliza' virtualenvwrapper', no el ejecutable que está instalado en el entorno virtual, p. cuando ejecuta 'mkproject'. Me encantaría estar equivocado, pero hasta ahora parece que la única forma de elegir una versión de Python diferente es usar '-p/--python' en la línea de comando' virtualenvwrapper'. Si eso es cierto, es una pena. –

+0

@ChrisJohnson mmmh desde entonces dejé de usar virtualenvwrapper, ya no me resulta muy necesario. No tengo una forma fácil de verificarlo rápidamente, pero es posible que tengas razón ... También en MAC uso brew ahora ... – Stefano

+0

Same como @ChrisJohnson en ubuntu. tenía mi 'VIRTUALENVWRAPPER_PYTHON' establecido en python2, pero' mkvirtualenv' creaba virtualenvs con python3. –

-1

Usted (el OP) parece haber instalado virtualenv y virtualenvwrapper con python2.7, y no con python2.6. Si se llama a python2.6 en el momento en que su shell carga el script virtualenvwrapper.sh, no está contento. Muy claro.

VIRTUALENVWRAPPER_PYTHON está hecho para esas situaciones. Con él, puede asegurarse de usar siempre la versión correcta de python, y no tiene que agregar siempre -p /path/to/python2.7

Entonces, no estoy de acuerdo con la respuesta de Stefano en ese caso, en la situación del OP, usted debería haber explicado claramente en su .bashrc qué pitón usar:

... 
export VIRTUALENVWRAPPER_PYTHON=/path/to/your/python2.7 
source /path/to/bin/virtualenvwrapper.sh 

¡Como que debería estar bien todo el tiempo! Virtualenvwrapper está hecho para simplificar las cosas.

Además, tenga en cuenta que /opt/local/bin/python debe haber un enlace a la versión de Python selecciona con port python select (compruebe que con ls -l /opt/local/bin/python para estar seguro).

+2

Me gustaría enfatizar que usar la bandera -p es una solución si tienes terminales en capas que te impiden establecer una variable de entorno (como yo). mkvirtualenv -p/usr/bin/python3 Foo – htmldrum

5

Confirmado el uso de dos variables de entorno con nombres similares:

VIRTUALENVWRAPPER_PYTHON - la versión de Python es utilizado por la utilidad virtualenvwrapper sí.

VIRTUALENV_PYTHON - la versión de Python se instalará por virtualenv cuando cree un nuevo entorno virtual. Equivalente a la opción -p/--python en la línea de comando virtualenv.

Y quizás obviamente :) La versión de Python ejecuta en un entorno virtual es la versión que ha instalado para que - no tiene relación con las variables de entorno por encima de una vez creado el env.

Ver https://stackoverflow.com/a/24724360/763269 de cómo actualizar Python en un virtualenv.

6

Ninguno de estos funcionó. Instalé Python3 primero cuando configuré mi máquina osx, y pip y todo por defecto.

En primer lugar, comprobar qué ha instalado Python:

$ `which python` -V 

Si esto devuelve "Python 2.7.12", entonces usted está listo para funcionar:

$ mkvirtualenv -p `which python` api_server 
Running virtualenv with interpreter /usr/local/bin/python 
New python executable in /Users/eric/.virtualenvs/api_server/bin/python2.7 
Also creating executable in /Users/eric/.virtualenvs/api_server/bin/python 
Installing setuptools, pip, wheel...done. 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/predeactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postdeactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/preactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/get_env_details 

Esto también activará el api_server workon, que cambia su ejecutable de Python:

$ which python 
/Users/eric/.virtualenvs/api_server/bin/python 
$ python -V 
Python 2.7.12 

Lo que hace which python en realidad? Genera el directorio de los archivos ejecutables de Python que se encuentran en su PATH:

$ which python 
/usr/local/bin/python 

Mediante el uso de which python, que son básicamente pasando en /usr/local/bin/python a la opción -p en el directorio mkvirtualenv.

Lo que sucede cuando se tiene más de un ejecutable de Python devuelto en which python? Sólo tiene que encontrar el que usted desea y pasarlo en:

$ mkvirtualenv -p /usr/local/bin/python3 api_server 

Y virtualenvwrapper acabará usando ese ejecutable pitón en su lugar.

Cuestiones relacionadas