我正在编写一个基于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更深层次的东西?
谢谢!
答案 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
调用都会创建一个新进程。您需要确保activate
和easy_install
在同一os.system
或subprocess
来电中运行。
答案 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}