2009-11-06 5 views
4

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

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?

Спасибо!

ответ

3

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

11

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

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

+0

Doh! Спасибо за помощь! – 2009-11-06 23:41:58

3

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

easy_install pip 
pip install -I ipython 
cd ~/bin 
python install_pythonw.py ${VIRTUAL_ENV} 
4

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