4

我正在编写一个基于 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

4 回答 4

11

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

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

于 2009-11-06T23:02:18.647 回答
5

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

于 2009-11-09T03:32:02.580 回答
4

每次os.system调用都会创建一个新进程。您需要确保 theactivate和 theeasy_install在相同的os.systemorsubprocess调用中运行。

于 2009-11-06T23:01:22.893 回答
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}
于 2009-11-07T04:53:48.657 回答