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