desactivar conflicto en virtualenvwapper y anaconda

Estoy usando virtualenv para cambiar mi env de python dev. Pero cuando ejecuto workon my_env , me encuentro con este mensaje de error:

 Error: deactivate must be sourced. Run 'source deactivate' instead of 'deactivate'. Usage: source deactivate removes the 'bin' directory of the environment activated with 'source activate' from PATH. 

Después de algunas búsquedas en google, parece que workon , que se define en /usr/local/bin/virtualenvwrapper.sh, las llamadas se deactivate . Y hay un script con el mismo nombre que está presente en el contenedor de Anaconda, por lo que es llamado por trabajo en error.

¿Alguna sugerencia para solucionar este conflicto?

Una solución que funciona para mí es cambiar el nombre a deactivate en el contenedor de Anaconda:

mv deactivate conda-deactivate

Estoy de acuerdo con el comentario de @FredrikHedman de que cambiar el nombre de los scripts en el directorio bin anaconda / miniconda tiene el potencial de ser frágil. Su publicación completa me llevó a lo que creo que es una respuesta más sólida. (¡Gracias!)

En lugar de simplemente deshacerse de cualquier error que se produzca al llamar al deactivate , podríamos simplemente condicionar ese llamado a si la función se llamaría frente al archivo . Como se mencionó, virtualenv y virtualenvwrapper crean una función llamada deactivate ; las * condas llaman a un archivo de script del mismo nombre.

Entonces, en el script virtualenvwrapper.sh , podemos cambiar las siguientes dos líneas que verifican si la deactivate es meramente invocable:

 type deactivate >/dev/null 2>&1 if [ $? -eq 0 ] 

con la prueba más estricta de si es una función de shell:

 if [ -n $ZSH_VERSION ] ; then nametype="$(type -w deactivate)" else nametype="$(type -t deactivate)" fi if [ "${nametype##* }" == "function" ] 

Este cambio evita desencadenar el error espurio observado en la pregunta original, pero no se arriesga a redirigir otros errores útiles o la salida al olvido silencioso.

Note la sustitución de variables en el tipo de nametype en la comparación. Esto se debe a que la salida del type -w bajo zsh devuelve algo así como ” name: type ” en lugar de type -t bajo bash que devuelve simplemente ” type “. La sustitución elimina todo hasta el último carácter de espacio, si existen espacios, dejando solo el valor de tipo. Esto inofensivamente no hace nada en bash .

(Gracias a @toprak por la prueba de zsh y por la marca correcta, type -w , debajo de zsh. ¡Espero más sugerencias de encoding entre shells!)

Como siempre, aprecio comentarios y comentarios constructivos!

Puede editar /usr/local/bin/virtualenvwrapper.sh para hacer que la deactivate apunte a una ruta absoluta hacia cualquier deactivate que supuestamente esté haciendo referencia.

Como no tengo la reputación suficiente para agregar un comentario: la sugerencia de Thomas Capote está bien (gracias a eso 4), excepto que “zsh” no tiene una opción “-t” para el comando de “tipo” incorporado. Por lo tanto, es necesario agregar otra statement condicional para obtener el resultado deseado para “nametype”:

 # Anaconda workaround for "source deactivate" message: # Start of workaround: #type deactivate >/dev/null 2>&1 #if [ $? -eq 0 ] if [ -n $ZSH_VERSION ] ; then nametype="$(type -w deactivate)" else nametype="$(type -t deactivate)" fi if [ "${nametype##* }" == "function" ] # End of workaround 

Espero que ayude a otros usuarios de zsh.

En anaconda activate es un script ejecutable ubicado en el directorio bin anaconda, pero es una función en virtualenvwrapper.sh . Así que esto es una especie de problema de colisión de espacio de nombres, pero también es un caso de superposición en la funcionalidad.

Anacondas es una distribución de python y, entre muchas otras cosas, tiene soporte para tratar con el entorno virtual a través de conda env mientras que virtualenvwrapper se enfoca en trabajar con diferentes entornos virtuales. El solo hecho de cambiar el nombre de la secuencia de comandos anaconda / bin / activar es una solución frágil y puede interrumpir la conda .

El código de virtualenvwrapper.sh (función workon ) ejecuta la deactivate que sucede al usar el script anaconda. Este script devuelve un error. El código de trabajo luego continúa y elimina el nombre de deactivate y genera su propia deactivate y también crea una función de deactivate sobre la marcha.

En resumen, hace lo correcto y el “error” se puede ver más como una advertencia. Si desea que desaparezca, puede modificar la función workon (buscar la línea # Deactivate any current environment "destructively" )

 deactivate --> deactivate >/dev/null 2>&1 

(He sugerido este cambio al mantenedor de virtualenvwrapper)