Quiero ejecutar mi script de tela localmente, que a su vez, iniciará sesión en mi servidor, cambiará el usuario para implementar, activará los proyectos .virtualenv, lo que cambiará el directorio del proyecto y emitirá un git pull.
def git_pull():
sudo('su deploy')
# here i need to switch to the virtualenv
run('git pull')
Normalmente uso el comando workon de virtualenvwrapper que obtiene el archivo de activación y el archivo de postactivación me colocará en la carpeta del proyecto. En este caso, parece que debido a que el tejido se ejecuta desde el shell, el control se transfiere al tejido, por lo que no puedo usar la fuente de bash incorporada a '$ source ~ / .virtualenv / myvenv / bin / enable'
¿Alguien tiene un ejemplo y una explicación de cómo han hecho esto?
python
virtualenv
fabric
automated-deploy
Thomas Schreiber
fuente
fuente
workon
como unprefix
?Respuestas:
En este momento, puedes hacer lo que yo hago, que es grosero pero funciona perfectamente bien * (este uso supone que estás usando virtualenvwrapper, que deberías serlo), pero puedes sustituirlo fácilmente en la llamada 'fuente' más larga que mencionaste , si no):
Desde la versión 1.0, Fabric tiene un
prefix
administrador de contexto que utiliza esta técnica para que pueda, por ejemplo:* Es
command1 && command2
probable que haya casos en los que el uso del enfoque pueda explotar sobre usted, como cuandocommand1
falla (command2
nunca se ejecutará) o sicommand1
no se escapa correctamente y contiene caracteres especiales de shell, y así sucesivamente.fuente
workon
es desconocido porsh
. ¿Cómo podemos decirle a la tela que use bash en su lugar?source venv/bin/activate
. Es más fácil y funciona fuera de la caja.workon
es una dependencia adicional e incluso si está instalado, debe agregarlo.bashrc
, demasiado complicado para las implementaciones de fabric.Como una actualización del pronóstico de bitprophet: con Fabric 1.0 puede utilizar el prefijo () y sus propios administradores de contexto.
fuente
source
es desconocido porsh
. ¿Cómo podemos decirle a la tela que use bash en su lugar?.
lugar desource
cd()
cuando estás especificando completamente la ruta haciaactivate
adentroprefix()
?prefix()
que no parece cd allí, vea estos documentos que hacen lo mismo. Queremoscd
allí para que cuandoyield
ejecutemos otros comandos (pip freeze
en mi ejemplo), esos comandos pueden ser relativos a ese directorio.Solo estoy usando una función de contenedor simple virtualenv () que se puede llamar en lugar de run (). No usa el administrador de contexto de CD, por lo que se pueden usar rutas relativas.
fuente
virtualenvwrapper
puede hacer esto un poco más simpleUso del enfoque de @ nh2 (este enfoque también funciona cuando se usa
local
, pero solo para instalaciones virtualenvwrapper donde seworkon
encuentra$PATH
, en otras palabras, Windows)O implemente su archivo fab y ejecútelo localmente. Esta configuración le permite activar virtualenv para comandos locales o remotos. Este enfoque es poderoso porque
local
evita la incapacidad de ejecutar .bashrc usandobash -l
:fuente
Este es mi enfoque sobre el uso
virtualenv
con implementaciones locales.Usando el administrador de contexto de path () de fabric puede ejecutar
pip
opython
con binarios de virtualenv.fuente
Gracias a todas las respuestas publicadas y me gustaría agregar una alternativa más para esto. Hay un módulo, fabric-virtualenv , que puede proporcionar la función como el mismo código:
fabric-virtualenv hace uso de
fabric.context_managers.prefix
, lo que podría ser una buena manera :)fuente
Si desea instalar los paquetes en el entorno o desea ejecutar comandos de acuerdo con los paquetes que tiene en el entorno, he encontrado este truco para resolver mi problema, en lugar de escribir métodos complejos de tela o instalar nuevos paquetes de sistema operativo:
De esta manera, es posible que no necesite activar el entorno, pero puede ejecutar comandos en el entorno.
fuente
Aquí hay un código para un decorador que dará como resultado el uso del entorno virtual para cualquier llamada de ejecución / sudo:
y luego para usar el decorador, tenga en cuenta que el orden de los decoradores es importante:
fuente
Este enfoque funcionó para mí, puedes aplicar esto también.
Asumiendo que
venv
es su directorio virtual env y agregue este método cuando sea apropiado.fuente