通过os.system()激活virtualenv

4 投票
4 回答
6225 浏览
提问于 2025-04-15 15:45

我正在写一个基于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本身有什么更深层次的问题呢?

谢谢!

4 个回答

6

其实你根本不需要用“source activate”这个命令。这个命令只是改变了你的命令行环境,把虚拟环境的bin目录放在最前面。假设你的脚本已经知道它刚创建的虚拟环境的目录,你只需要用完整路径去调用那个目录下的程序,比如用 _virtualenv_dir_/bin/easy_install 来安装东西,或者用 _virtualenv_dir_/bin/python 来运行虚拟环境里的其他Python脚本。

11

每次调用 os.system 时,都会在一个新的子进程中运行命令,这个子进程和原来的 Python 进程有相同的特性。

你可以试着把多个命令放在一个字符串里,用分号隔开。

5

每次调用 os.system 时,都会创建一个新的进程。你需要确保 activateeasy_install 在同一个 os.systemsubprocess 调用中运行。

撰写回答