名前が空の環境変数の設定解除

名前が空の環境変数の設定解除

何らかの理由で、私のシステムは名前なしで環境変数を設定します。これは、Pythonに問題を引き起こすオブジェクト(より具体的にはオブジェクト)printenvのみを含む縮小出力で見ることができます。=os.environ

この環境変数をどのように設定解除できますか?他の回避策があります(たとえば、変数が最初に設定されないようにするなど)。

例を再現するenv -i printenvか、Pythonの問題の場合は、次を実行してください。env -i = python -c "import os; os.environ.clear()"

答え1

環境変数は空の名前を持つべきではないので、多くのユーティリティはそれをサポートしません。

GNU coreutilsコマンドはenv空の名前で環境変数の設定をサポートしますが、設定を解除することはできません。これは間違いです。

$ env '=wibble' env |grep wibble                                 
=wibble
$ env '=wibble' env -u '' env
env: cannot unset `': Invalid argument

通常のシェルは空の名前を設定解除することもできません。大丈夫です。空の名前は環境変数やシェル変数として使用しないでください。 Zshは欠陥のある唯一の製品です。仕事をするふりをするが、実際には何もしない。

$ env '=wibble' dash -c 'unset ""'
dash: 1: unset: : bad variable name
$ env '=wibble' bash -c 'unset ""'
bash: line 0: unset: `': not a valid identifier
$ env '=wibble' ksh -c 'unset ""'
ksh[1]: unset: : invalid variable name
$ env '=wibble' mksh -c 'unset ""'
mksh: : is read only
$ env '=wibble' posh -c 'unset ""'
posh: unset:  is read only
$ env '=wibble' zsh -c 'unset ""'
$ env '=wibble' zsh -c 'unset ""; env' | grep wibble
=wibble

ご存知のように、Pythonは環境変数に空の名前が見つかるとエラーが発生します。

パールそのような問題はないので、回避策になることもできます。外部プロセスを使用して環境を変更するには、新しいシェルを実行する必要があります。

perl -e 'delete $ENV{""}; exec $ARGV[0] @ARGV' "$SHELL" "-$-"

答え2

あなたはできます:

import os
for k in os.environ.keys():
     print repr(k)
     del os.eniviron[k]
print os.environ
os.environ.clear()

os.environ.clear() エラーが発生した理由がわからないので、上記のforループコードを起動して問題の原因を見つけることができるかどうかを確認しました。を指定する必要があります。繰り返すキーの辞書を変更(コピー作成)するため、.keys()usingを繰り返すとエラーになります。for k in os.environ:.keys()

関連情報