Я пытаюсь запустить некоторые команды управления Django через Fabric на моем промежуточном сервере.
Проблема заключается в том, что Fabric не может активировать virtualenv и, таким образом, используя системные python/libs при выполнении команд.
На сервере приложение Django запускается с использованием virtualenv (нет, я не использую virtualenvwrapper еще...)
Используя Fabric (1.0.1), команда может выглядеть так, когда вы запускаете из моего окна:
Метод 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)
Выход:
$ 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.
Я знаю, конечно, что команда jango collectstatic не существует в версиях до 1.3, что заставляет med думать, что системный python (который использует Django 1.2) используется.
My fabfile/project layout основан на отличном fabfile от участников Tribapps
Итак, я создал метод ткани для проверки 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)
При запуске он дает следующий результат:
$ 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',
Как вы можете видеть, он использует системный python, а не мой virtualenv, расположенный в home/newsapps/sites/mysite/env
Но если я запустил эту команду непосредственно на сервере
source /home/newsapps/sites/mysite/env/bin/activate && echo "import sys; print sys.path" | python
.. затем он выдает правильные пути из virtualenv
Что я делаю неправильно, так как команды не запускаются с помощью python из моего virtualenv с помощью Fabric?