Активируйте virtualenv через os.system ()

Я пишу сценарий оболочки на основе Python для создания шаблона приложения Django с помощью virtualenv, pip и fabric. Должно быть достаточно просто, но похоже, что я не могу активировать и запускать команды в virtualenv через сценарий оболочки.

os.system('virtualenv %s --no-site-packages' % project_name)
os.system('source %s/bin/activate' % project_name)
os.system('easy_install pip')

При запуске выдает ошибку:

$ startproject+ -s false sample
New python executable in sample/bin/python
Installing setuptools............done.
/testing
Searching for pip
Best match: pip 0.4
Processing pip-0.4-py2.6.egg
pip 0.4 is already the active version in easy-install.pth
Installing pip script to /usr/local/bin
error: /usr/local/bin/pip: Permission denied

Очевидно, линия source не запускается, но почему? Это проблема параллелизма / многопоточности или что-то более глубокое с virtualenv?

Спасибо!


person Community    schedule 06.11.2009    source источник


Ответы (4)


Каждый os.system вызов создает новый процесс. Вам необходимо убедиться, что activate и easy_install выполняются в одном вызове os.system или subprocess.

person Ned Deily    schedule 06.11.2009

Каждый вызов os.system запускает команду в новой подоболочке, которая имеет те же свойства, что и исходный процесс python.

Попробуйте поместить команды в одну строку, разделенную точкой с запятой.

person Matthew Schinckel    schedule 06.11.2009

Просто не используйте «активацию источника» вообще. Он ничего не делает, кроме изменения PATH вашей оболочки, чтобы сначала поместить каталог bin virtualenv. Я предполагаю, что ваш скрипт знает каталог только что созданного им virtualenv; все, что вам нужно сделать, это вызвать _virtualenv_dir_ / bin / easy_install, указав полный путь. Или _virtualenv_dir_ / bin / python для запуска любого другого скрипта python в файле virtualenv.

person Carl Meyer    schedule 09.11.2009

Вы также можете установить virtualenvwrapper и использовать обработчик postmkvirtualenv. Я использую его для автоматического добавления свежих копий pip и IPython в виртуальные серверы, которые я создаю (так как я не хочу, чтобы он использовал мой системный IPython). Я также использую его для копирования pythonw в virtualenv, иначе вещи на основе wx не будут работать. Выглядит так:

easy_install pip
pip install -I ipython
cd ~/bin
python install_pythonw.py ${VIRTUAL_ENV}
person Jay P.    schedule 07.11.2009