Estoy intentando ejecutar algunos comandos de administración de Django a través de Fabric en mi servidor de transferencia.Problema al activar virtualenv en el servidor a través de Fabric
El problema es que parece que Fabric no puede activar el virtualenv y, por lo tanto, usa el sistema python/libs al ejecutar los comandos.
En el servidor de la aplicación de Django se ejecuta utilizando un virtualenv (no, Yo no utilizo virtualenvwrapper sin embargo ...)
El uso de Tela (1.0.1) un comando podría tener este aspecto cuando se ejecuta desde mi caja :
El método fabfile:
def collectstatic():
require('settings', provided_by=[production, staging])
with settings(warn_only=True):
run('source %(env_path)s/bin/activate && python %(repo_path)s/%(project_name)s/configs/%(settings)s/manage.py collectstatic --noinput -v0' % env)
La salida:
$ fab staging master collectstatic
[myserver.no] Executing task 'master'
[myserver.no] Executing task 'collectstatic'
[myserver.no] run: source /home/newsapps/sites/mysite/env/bin/activate && python /home/newsapps/sites/mysite/repository/mysite/configs/staging/manage.py collectstatic --noinput -v0
[myserver.no] Login password:
[myserver.no] out: Unknown command: 'collectstatic'
[myserver.no] out: Type 'manage.py help' for usage.
Sé, por supuesto, que el comando Django collectstatic no existe en versiones anteriores a la 1.3 lo que lleva a pensar que ese sistema python (que tiene Django 1.2) está siendo utilizado.
Mi diseño fabfile/proyecto se basa en la great fabfile of the Tribapps guys
así que creé un método de tela para probar pythonversion:
def pythonver():
require('settings', provided_by=[production, staging])
with settings(warn_only=True):
run('source %(env_path)s/bin/activate && echo "import sys; print sys.path" | python ' % env)
Cuando ejecutarlo da el siguiente resultado:
$ fab staging master pythonver
[myserver.no] Executing task 'master'
[myserver.no] Executing task 'pythonver'
[myserver.no] run: source /home/newsapps/sites/mysite/env/bin/activate && echo "import sys; print sys.path" | python
[myserver.no] Login password:
[myserver.no] out: ['', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/pymodules/python2.6', '/usr/lib/pymodules/python2.6/gtk-2.0',
Como puede ver, usa el sistema python y no mi virtualenv ubicado en home/newsapps/sites/mysite/env
Pero si me quedo este comando directamente en el servidor
source /home/newsapps/sites/mysite/env/bin/activate && echo "import sys; print sys.path" | python
.. entonces se visualizan los caminos correctos de la virtualenv
¿Qué estoy haciendo mal ya que los comandos no se ejecutan con la pitón de mi virtualenv usando Fabric?
añado mis entradas PYTHONPATH adicionales (tales como el directorio raíz de su proyecto) en el archivo de mi postactivate virtualenv. Yo asumiría que este método no agrega eso.¿Debo colocar estos en otro lugar? – PKKid
Puede agregar los archivos ' .pth' a su directorio' /lib/python2.x/site-packages/'. Estos pueden contener una ruta que se agregará a su 'PYTHONPATH'. Lo hago como parte de mi proceso de implementación. –
O bien, puede convertir su proyecto en un paquete instalable (proporcionarle un archivo 'setup.py') e instalarlo usando' pip -e', que hace lo mismo. –