web-dev-qa-db-ja.com

Pythonで環境変数「http_proxy」を設定解除する方法

以下を使用しています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
3
Sum

os.system()を呼び出すたびに、独自の新しい環境で独自のサブシェルで実行されます。

>>> import os
>>> os.system("echo $$")
97678
0
>>> os.system("echo $$")
97679
0

あなたはarehttp_proxy変数の設定を解除しますが、サブシェルはコマンドの実行を完了し(unset)、終了します。次に、echoを実行する新しい環境で新しいサブシェルを開始します。

私はあなたがやろうとしているのはdel os.environ['http_proxy']、またはhttp_proxy環境変数が以前に存在したかどうかにかかわらず存在しないことを保証したい場合はos.environ.pop('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
8
DopeGhoti

os.system()を呼び出すたびに、個別のプロセスが作成されます。両方で_echo $$_を実行して、PIDがそれぞれに変化することを確認します。

したがって、最初のos.system()は、その内部に1つの変数unsetsを含む新しいプロセスを生成します。これは、pythonスクリプトのプロセスの変数値には影響しません。次に、最初に生成されたプロセスが終了し、新しいプロセスを生成します。2番目のos.system()は、この新しいプロセスを生成しますpythonスクリプト-変更されていないすべての環境変数を継承するプロセスです。したがって、unsetではなかったので、当然、2番目に生成されたプロセスは変数を参照します。 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 の公式ドキュメント.

4
chicks