次のPythonコードを使用してLinux CentOS 6で環境変数をリセットしますhttp_proxy
が、残りの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()
独自の新しい環境を持つ独自のサブシェルで実行されます。
>>> import os
>>> os.system("echo $$")
97678
0
>>> os.system("echo $$")
97679
0
あなたはい変数はunsethttp_proxy
ですが、サブシェルはコマンドの実行を完了し(たとえば)unset
終了します。その後、実行したい新しい環境で新しいサブシェルを起動できます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スクリプトプロシージャ内の変数の値には影響しません。その後、最初に生成されたプロセスが終了し、新しいプロセスが作成されます。 2番目は、os.system()
まだ触れていないPythonスクリプトのすべての環境変数を継承するこの新しいプロセスを作成します。もちろん、2番目に生成されたプロセスはunset
Pythonスクリプトのプロセスに存在しなかったため、その変数を見ることができるため、新しい子プロセスで失われることはありません。
バラよりhttps://stackoverflow.com/questions/3575165/what-is-the-Cordirect-way-to-unset-a-linux-environment-variable-in-pythonPythonでこれを行う方法とhttp://docs.python.org/library/os.html#os.environ公式文書用。