如何在 Python 中取消设置“http_proxy”环境变量

如何在 Python 中取消设置“http_proxy”环境变量

我使用下面的 python 代码来重置http_proxyLinux 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对于官方文档。

相关内容