¿Cómo se crea un script Bash para activar un virtualenv de Python?
Tengo una estructura de directorio como:
.env
bin
activate
...other virtualenv files...
src
shell.sh
...my code...
Puedo activar mi virtualenv por:
user@localhost:src$ . ../.env/bin/activate
(.env)user@localhost:src$
Sin embargo, hacer lo mismo desde un script Bash no hace nada:
user@localhost:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
user@localhost:src$ ./shell.sh
user@localhost:src$
¿Qué estoy haciendo mal?
python
bash
virtualenv
Cerin
fuente
fuente
source
es cambiar algo en el shell actual. Puede usar el python de virtualenv usando la ruta completa./env/bin/python
.Respuestas:
Cuando obtiene, está cargando el script de activación en su shell activo.
Cuando lo hace en un script, lo carga en ese shell que se cierra cuando finaliza el script y vuelve a su shell original inactivo.
Tu mejor opción sería hacerlo en función
o un alias
Espero que esto ayude.
fuente
Debería llamar al script bash usando source.
Aquí hay un ejemplo:
En tu caparazón simplemente llámalo así:
O como sugirió @outmind: (Tenga en cuenta que esto no funciona con zsh)
Ahí lo tienes, la indicación de la cáscara se colocará en tu mensaje.
fuente
source "/home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate"
produce:/home/surest/Desktop/testservers/TEST_VENV/py3.sh: 10: /home/surest/Desktop/testservers/TEST_VENV/py3.sh: source: not found
which source
en un indicador de shell, sin embargo,source venv3/bin/activate
hace lo que espero y abro el venv. ...source ./env/bin/activate
(con el mismo#!/bin/bash
prefijo) no? ¿Cuál es la diferencia entre usar comillas y no usarlas?source ./env/bin/activate
porque esto es relativo a la ruta que está ejecutando, ¿verdad? Si cambia el directorio dentro del script, puede volverse relativo.Aunque no agrega el prefijo "(.env)" al indicador de shell, encontré que este script funciona como se esperaba.
p.ej
fuente
/bin/bash
a/usr/bin/env bash
deactivate
desde el subshell conexit
o Ctrl + dEl abastecimiento ejecuta comandos de shell en su shell actual. Cuando obtiene dentro de un script como lo está haciendo arriba, está afectando el entorno de ese script, pero cuando el script sale, los cambios de entorno se deshacen, ya que efectivamente se han salido del alcance.
Si su intención es ejecutar comandos de shell en virtualenv, puede hacerlo en su script después de obtener el script de activación. Si su intención es interactuar con un shell dentro del virtualenv, entonces puede generar un sub-shell dentro de su script que heredaría el entorno.
fuente
Aquí está el guión que uso a menudo. Ejecutarlo como
$ source script_name
fuente
¿Para qué sirve el origen del script bash?
Si tiene la intención de cambiar entre múltiples virtualenv o ingresar un virtualenv rápidamente, ¿ha probado?
virtualenvwrapper
? Proporciona muchas utilidades comoworkon venv
,mkvirtualenv venv
etc.Si acaba de ejecutar un script de Python en cierto virtualenv, utilícelo
/path/to/venv/bin/python script.py
para ejecutarlo.fuente
workon ...
desde un script bash. (Porque quiero ejecutar más cosas después cada vez que se inicia). Sin embargo, no puedo encontrar la manera de que funcione.También puede hacer esto usando una subcapa para contener mejor su uso; aquí hay un ejemplo práctico:
Este estilo es especialmente útil cuando
commandA
ocommandC
existe bajo/opt/bin
commandB
existe en el sistemaPATH
o es muy comúnfuente
$(...)
o le faltarán espacios y pestañas en el resultado."${VAR}"
es estrictamente equivalente a"$VAR"
que no necesita corchetes alrededor de las variables de shell porque las comillas dobles son en realidad más poderosas. La excepción es cuando se usan modificadores como, por ejemplo"${VAR:-default_value}"
PATH=$PATH:/opt/bin
necesita una cita adecuada para manejar rutas con espacios y tabulaciones.edit
botón debajo de las publicaciones para sugerir cambios. Además, sepa que, si bien a menudo es un requisito e importante para la seguridad, cualquiera que a sabiendas agregueIFS
caracteresPATH
es un terrorista.Debe utilizar varios comandos en una línea. por ejemplo:
cuando activa su entorno virtual en una línea, creo que se olvida de otras líneas de comando y puede evitarlo utilizando varios comandos en una línea. Funcionó para mí :)
fuente
Cuando estaba aprendiendo venv, creé un script para recordarme cómo activarlo.
Esto tiene la ventaja de que cambia el indicador.
fuente