workon mkvirtualenv mac activar python bash virtualenv virtualenvwrapper

python - mkvirtualenv - virtualenvwrapper ubuntu



virtualenvwrapper funciones no disponibles en scripts de shell (7)

Entonces, una vez más, hago un buen programa de Python que hace que mi vida sea más fácil y ahorra mucho tiempo. Por supuesto, esto implica un virtualenv, hecho con la función mkvirtualenv de virtualenvwrapper. El proyecto tiene un archivo requirements.txt con algunas bibliotecas necesarias (también solicitudes: D) y el programa no se ejecutará sin estas bibliotecas.

Estoy intentando agregar un script de shell ejecutable bin/run-app que estaría en mi camino (enlace simbólico en realidad). Ahora, dentro de este script, necesito cambiar al virtualenv antes de poder ejecutar este programa. Así que puse esto en

#!/bin/bash # cd into the project directory workon "$(cat .venv)" python main.py

Un archivo .venv contiene el nombre virtualenv. Pero cuando ejecuto este script, obtengo el error workon: command not found .

Por supuesto, tengo el virtualenvwrapper.sh de mi bashrc pero no parece estar disponible en este script de shell.

Entonces, ¿cómo puedo acceder a esas funciones virtualenvwrapper aquí? ¿O estoy haciendo esto de la manera incorrecta? ¿Cómo lanzas tus herramientas de python, cada una de ellas tiene su propio virtualenv?


Aparentemente, estaba haciendo esto de la manera incorrecta. En lugar de guardar el nombre del virtualenv en el archivo .venv, debería colocar la ruta del directorio de virtualenv.

(cdvirtualenv && pwd) > .venv

y en bin/run-app , puse

source "$(cat .venv)/bin/activate" python main.py

Y yay!


Es un problema conocido . Como solución alternativa, puede convertir el contenido del script en una función y colocarlo en ~/.bashrc o ~/.profile

function run-app() { workon "$(cat .venv)" python main.py }


No puedo encontrar la manera de activar los comandos de virtualenvwrapper en shell. Pero este truco puede ayudar: asumir su env. name es myenv , luego coloca las siguientes líneas al comienzo de los scripts:

ENV=myenv source $WORKON_HOME/$ENV/bin/activate


Si su script de Python requiere un virtualenv particular, póngalo / instálelo en el directorio bin de virtualenv. Si necesita acceder a esa secuencia de comandos fuera del entorno, puede hacer un enlace simbólico.

main.py del bin de virtualenv:

#!/path/to/virtualenv/bin/python import yourmodule if __name__=="__main__": yourmodule.main()

Enlace simbólico en su RUTA:

pymain -> /path/to/virtualenv/bin/main.py

En bin / run-app:

#!/bin/sh # cd into the project directory pymain arg1 arg2 ...


Simplemente virtualenvwrapper.sh script virtualenvwrapper.sh en su script para importar las funciones de virtualenvwrapper. Debería poder usar la función workon en su script.

Y tal vez mejor, podría crear un script de shell (podría nombrarlo venv-run.sh por ejemplo) para ejecutar cualquier script de Python en un virtualenv determinado, y colocarlo en /usr/bin , /usr/local/bin , o cualquier directorio que esté en tu PATH .

Tal script podría verse así:

#!/bin/sh # if virtualenvwrapper.sh is in your PATH (i.e. installed with pip) source `which virtualenvwrapper.sh` #source /path/to/virtualenvwrapper.sh # if it''s not in your PATH workon $1 python $2 deactivate

Y podría usarse simplemente como venv-run.sh my_virtualenv /path/to/script.py


También puede llamar directamente al ejecutable python de Virtualenv. Primero encuentra la ruta al ejecutable:

$ workon myenv $ which python /path/to/virtualenv/myenv/bin/python

Luego llama desde tu script de shell:

#!/bin/bash /path/to/virtualenv/myenv/bin/python myscript.py


agregue estas líneas a su .bashrc o .bash_profile

export WORKON_HOME=~/Envs source /usr/local/bin/virtualenvwrapper.sh

y vuelve a abrir tu terminal y prueba