有没有办法在python解释器中停用virtualenv?即类似于deactivate_this

时间:2014-08-28 22:36:50

标签: python virtualenv

我有这个脚本(这是openshift应用程序的wsgi脚本的开头)。该脚本使用in-python系统环境激活virtualenv。

#!/usr/bin/python
import os

virtenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/'
virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
try:
    execfile(virtualenv, dict(__file__=virtualenv))
except IOError:
    pass

相反的是什么?即:有一种类似的方法来做一个" deactivate_this"? (像我这样创建的virtualenvs中似乎没有这样的文件)

这意味着:我不想重新发明轮子。我问是否有准备好的命令行。

2 个答案:

答案 0 :(得分:2)

我认为简短的答案是否定。

中等答案是"除非您在执行activate_this.py之前保存了环境状态"。

或许实现目标的方法是将需要在venv中运行的应用程序部分与不需要运行的部分分开。然后使用子进程激活venv并运行任何你想要的东西,当子进程终止时,原始进程(在原始环境中)可以恢复。

注意这篇文章(How to leave/exit/deactivate a python virtualenv?)表明激活可能会提供一个shell函数来放回一切。您需要检查您的activate_this.py脚本是否提供了类似的内容,但听起来您已经检查了这一点。

答案 1 :(得分:0)

这是@TomDalton给出的答案的补充。虽然没有自动提供的方法来执行此操作,但activate_this脚本提供了一些方法。

首先,重要的是要记住这一行:

execfile(virtualenv, dict(__file__=virtualenv))

调用函数时不传递全局变量字典,也不传递本地字典。这意味着执行上下文将是当前全局变量(即来自调用行的全局变量)和本地对象。 此类行将更改我们当前拥有的变量 - 将覆盖调用环境 See here for docs about

通过这种方式,由于变量被覆盖,activate_this为我们提供了一些变量,如:

old_os_path = os.environ['PATH']
#the previous PATH

prev_sys_path = list(sys.path)
#the old Python Path

if sys.platform == 'win32':
    site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
    site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
#site_packages is the extended venv's packages dir.
#sys.path is affected here

sys.real_prefix = sys.prefix
#the old system prefix

如果我们想要手动停用,我们可以恢复这些变量:

import sys, os, site
sys.path[:0] = prev_sys_path #will also revert the added site-packages
sys.prefix = sys.real_prefix
os.setenv('PATH', old_os_path)