我正在使用virtualenv和virtualvwrapper。我可以使用workon命令在virtualenv之间切换。
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$
如何退出所有虚拟环境并再次使用系统环境?现在,我唯一能回到me@mymachine:~$是退出shell并开始新的shell。这有点烦人。是否有命令处理“无”,如果有,是什么?如果不存在这样的命令,我将如何创建它?
我在编写安装程序脚本时遇到了同样的问题。我看了一下bin/activate_this.py做了什么,并将其反转。
例子:
#! /usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
# Path to virtualenv
venv_path = os.path.join('/home', 'sixdays', '.virtualenvs', 'test32')
# Save old values
old_os_path = os.environ['PATH']
old_sys_path = list(sys.path)
old_sys_prefix = sys.prefix
def deactivate():
# Change back by setting values to starting values
os.environ['PATH'] = old_os_path
sys.prefix = old_sys_prefix
sys.path[:0] = old_sys_path
# Activate the virtualenvironment
activate_this = os.path.join(venv_path, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
# Print list of pip packages for virtualenv for example purpose
import pip
print str(pip.get_installed_distributions())
# Unload pip module
del pip
# Deactivate/switch back to initial interpreter
deactivate()
# Print list of initial environment pip packages for example purpose
import pip
print str(pip.get_installed_distributions())
我不能100%确定它是否按预期工作。我可能完全错过了什么。
使用venv的激活脚本提供的去激活功能需要您相信去激活功能是正确编码的,以便将所有环境变量干净地重置为原来的状态-不仅要考虑到原始激活,还要考虑到您在此期间可能完成的任何开关、配置或其他工作。
这可能很好,但它确实引入了一个新的、非零的风险,即在之后修改环境。
然而,从技术上讲,一个进程不可能直接更改其父进程的环境变量,因此我们可以使用单独的子shell来确保我们的供应商不会留下任何剩余的更改:
要激活:
$bash--初始化文件PythonVenv/bin/activate
这将在供应商周围开始一个新的外壳。原始bash shell保持未修改。
要停用:
$exit或[CTRL]+[D]
这将退出venv所在的整个shell,并将您从激活脚本对环境进行任何更改之前返回到原始shell。
例子:
[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!
[user@computer ~]$ bash --init-file PythonVenv/bin/activate
(PythonVenv) [user@computer ~]$ echo $VIRTUAL_ENV
/home/user/PythonVenv
(PythonVenv) [user@computer ~]$ exit
exit
[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!
运行deactivate[环境名称]可以从python环境中退出/停用。
PowerShell中的python3.6 Windows 10示例:
PS C:\Users\kyrlon\Desktop> py -m venv env1
PS C:\Users\kyrlon\Desktop> .\env1\Scripts\activate
(env1) PS C:\Users\kyrlon\Desktop> deactivate env1
PS C:\Users\kyrlon\Desktop> py -m venv env1
Linux Ubuntu 20.04 LTS桌面上的python3.9示例:
kyrlon@pc1:~$ python3 -m venv venv1
kyrlon@pc1:~$ source venv1/bin/activate
(venv1) kyrlon@pc1:~$ deactivate venv1
kyrlon@pc1:~$
我在编写安装程序脚本时遇到了同样的问题。我看了一下bin/activate_this.py做了什么,并将其反转。
例子:
#! /usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
# Path to virtualenv
venv_path = os.path.join('/home', 'sixdays', '.virtualenvs', 'test32')
# Save old values
old_os_path = os.environ['PATH']
old_sys_path = list(sys.path)
old_sys_prefix = sys.prefix
def deactivate():
# Change back by setting values to starting values
os.environ['PATH'] = old_os_path
sys.prefix = old_sys_prefix
sys.path[:0] = old_sys_path
# Activate the virtualenvironment
activate_this = os.path.join(venv_path, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
# Print list of pip packages for virtualenv for example purpose
import pip
print str(pip.get_installed_distributions())
# Unload pip module
del pip
# Deactivate/switch back to initial interpreter
deactivate()
# Print list of initial environment pip packages for example purpose
import pip
print str(pip.get_installed_distributions())
我不能100%确定它是否按预期工作。我可能完全错过了什么。