通过os.system()激活virtualenv

时间:2009-11-06 22:55:18

标签: python django virtualenv fabric pip

我正在编写一个基于Python的shell脚本,用virtualenv,pip和fabric来构建一个Django应用程序。应该很简单,但似乎我无法通过shell脚本激活和运行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更深层次的东西?

谢谢!

4 个答案:

答案 0 :(得分:11)

每次调用os.system都会在新的子shell中运行命令,该子shell具有与原始python进程相同的属性。

尝试将命令放入由分号分隔的一个字符串中。

答案 1 :(得分:4)

根本就不要使用“source activate”。它只会改变你的shell PATH,将virtualenv的bin目录放在第一位。我假设你的脚本知道它刚刚创建的virtualenv的目录;您所要做的就是通过完整路径调用_virtualenv_dir_ / bin / easy_install。或者_virtualenv_dir_ / bin / python用于在virtualenv中运行任何其他python脚本。

答案 2 :(得分:3)

每个os.system调用都会创建一个新进程。您需要确保activateeasy_install在同一os.systemsubprocess来电中运行。

答案 3 :(得分:3)

你也可以安装virtualenvwrapper,并使用postmkvirtualenv钩子。我用它来自动将pip和IPython的新副本引入我创建的virtualenvs(因为我不希望它使用我的系统IPython)。我也用它来将pythonw复制到virtualenv中,否则基于wx的东西将无效。看起来像这样:

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