2011-09-24 23 views
49

Así que, una vez más, hago un buen programa de python que hace mi vida mucho 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.virtualenvwrapper funciones no disponibles en scripts de shell

Estoy tratando de 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. Por lo que poner 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 virtualenvwrapper.sh en 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?

Respuesta

57

Justo Fuente el guión en virtualenvwrapper.sh su script para importar las funciones de virtualenvwrapper. Debería poder utilizar la función workon en su secuencia de comandos.

Y tal vez mejor, se podría crear un script de shell (se podía nombrarlo venv-run.sh por ejemplo) para ejecutar cualquier secuencia de comandos de Python en un virtualenv dado, y lo coloca en /usr/bin, /usr/local/bin, o cualquier directorio que está en su PATH.

un script de este tipo podría tener este aspecto:

#!/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 ser utilizado simplemente como venv-run.sh my_virtualenv /path/to/script.py

+2

Esto requiere una codificación rigurosa de la ubicación de los scripts virtualenvwrapper.sh, que depende del sistema operativo, entre muchas otras cosas. –

+0

@ShrikantSharat, como esto es solo una forma más fácil de ejecutar scripts en virtualenv (solo en tu sistema), realmente no debería ser un problema, ¿o sí? Si desea distribuir su código, dudo que le pida a los usuarios que instalen virtualenv y creen uno, simplemente le daría una lista de dependencias para instalar. – MatToufoutu

+0

Los * usuarios * serían mis amigos techy que también querrían un virtualenv para las dependencias de este programa. No tengo que pedirles que lo hagan;) –

0

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 a partir de virtualenv bin:

#!/path/to/virtualenv/bin/python 
import yourmodule 

if __name__=="__main__": 
    yourmodule.main() 

enlace simbólico en su PATH:

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

En bin/aplicación de gestión:

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

Esto funciona, pero no me gustaría poner el camino de la serpiente pitón de virtualenv en el #! línea, se siente un poco sucio. Además, este paso adicional de crear main.py * inside * the virtualenv lo hace menos portátil. Mis amigos no pueden simplemente clonarlo y ejecutarlo :) –

+0

@Shrikant Sharat: Si escribes setup.py simplemente 'pip install' hace por ti tanto shebang como copiando a virtualenv/bin. Tus amigos pueden: 'pip install git + ...' si les gusta el borde de sangría. Tenga en cuenta que en este caso 'main.py' se copia a * their * virtualenv y shebang se escribe para apuntar a * their * virtualenv/python. – jfs

+0

@Sebastian, nunca consideró esa opción, pero suena bien. Cualquier buena lectura de doc sobre la que recomiendes (aparte de los documentos de Python que estoy revisando ahora), en su caso. ¡Gracias! –

0

Al parecer, yo estaba haciendo esto por el camino equivocado. 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 el bin/run-app, puse

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

Y yay!

7

No encuentro la forma de activar los comandos de virtualenvwrapper en el intérprete de comandos.Pero este truco puede ayudar: asumir su env. nombre es myenv, a continuación, poner las líneas siguientes al inicio de guiones:

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

añadir estas líneas a su .bashrc o .bash_profile

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

y volver a abrir el terminal y tratar

0

Puede también llame al ejecutable python de virtualenv directamente. En primer lugar encontrar la ruta al ejecutable:

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

A continuación, llamar a la secuencia de comandos de la shell:

#!/bin/bash 

/path/to/virtualenv/myenv/bin/python myscript.py 
0

Es un known issue. Como solución, puede hacer que el contenido de la escritura de una función y colocarlo en cualquier ~/.bashrc o ~/.profile

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