Проблема с активацией virtualenv на сервере через Fabric

Я пытаюсь запустить некоторые команды управления 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.

Я, конечно, знаю, что команда Django collectstatic не существует в версиях до 1.3, что заставляет медиков думать, что используется системный python (с Django 1.2).

Макет моего fabfile / проекта основан на великом fabfile ребят из Tribapps

Поэтому я создал метод фабрики для проверки версии python:

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', 

Как вы видно, что он использует системный питон, а не мой виртуальный сервер, расположенный в home / newsapps / sites / mysite / env

Но если я запустил эту команду прямо на сервере

source /home/newsapps/sites/mysite/env/bin/activate && echo "import sys; print sys.path" | python 

.. затем он выводит правильные пути из virtualenv

. Что я делаю не так, поскольку команды не запускаются с питоном из моего virtualenv с использованием Fabric?

10
задан Anders E 9 May 2011 в 08:33
поделиться