我使用下面的 python 代码来重置http_proxy
Linux CentOS 6 中的环境变量,但它并没有取消设置 Python 脚本其余部分的变量。
代码:
import os
print "Unsetting http..."
os.system("unset http_proxy")
os.system("echo $http_proxy")
print "http is reset"
输出:
Unsetting http...
http://web-proxy.xxxx.xxxxxxx.net:8080
http is reset
Process finished with exit code 0
答案1
每次调用都os.system()
在其自己的子 shell 中运行,并具有自己的新环境:
>>> import os
>>> os.system("echo $$")
97678
0
>>> os.system("echo $$")
97679
0
你是取消设置http_proxy
变量,但随后您的子 shell 已完成执行命令(即:)unset
并终止。然后,您可以使用要运行的新环境启动一个新的子 shell echo
。
我相信您想要做的是del os.environ['http_proxy']
,或者os.environ.pop('http_proxy')
如果您想确保没有http_proxy
环境变量,无论以前是否存在:
$ export foo=bar
$ python2
Python 2.7.10 (default, Jul 15 2017, 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['foo']
'bar'
>>> del os.environ['foo']
>>> os.system('echo $foo')
0
答案2
每次调用os.system()
都会创建一个单独的进程。在它们内部进行操作echo $$
,查看 PID 随每个的变化。
因此,您的第一个os.system()
进程会产生一个新进程,该进程内部unset
有一个变量。这不会影响 python 脚本过程中的变量值。然后第一个生成的进程退出并生成一个新进程。第二个os.system()
产生这个新进程,它继承了 python 脚本中的所有环境变量——这些变量还没有被触及。因此,第二个生成的进程当然会看到该变量,因为它从未出现unset
在 python 脚本的进程中,因此它不会从任何新的子进程中丢失。
看https://stackoverflow.com/questions/3575165/what-is-the- Correct-way-to-unset-a-linux-environment-variable-in-python如何在 python 中执行此操作以及http://docs.python.org/library/os.html#os.environ对于官方文档。