2012-06-08 9 views
29

subprocess.Popenで起動された小さなPythonアプリケーションがあり、環境変数の形でいくつかのパラメータが必要です。私は、環境構造をPopenコールに渡すことによってこれを行います。プログラムはos.getenvを介して変数を読み込みます。os.environ ['foo']はいつos.getenv( 'foo')にマッチしませんか?

むしろ、それはそうした方法で読んでいました。 Windowsでは、正常に動作しました。しかし、私たちのFreeBSDサーバ、os.getenv戻り我々は、渡されたすべてのパラメータのNone。上の奇妙な部分はos.environは、単に両方のプラットフォームでうまくos.environ['foo']作られたすべての作品へのすべてのos.getenv('foo')のコールを切り替え、確かに、ちょうど—罰金や価値観を持っているということです。

これらの値が異なるのはなぜですか?どちらが適切なのですか?

答えて

17

os.environは、osモジュールのインポート時に作成され、直接変更しない限り、後で発生する環境への変更は反映されません。しかし興味深いことに、os.getenv()は、少なくともCPythonではなく、最近の環境変数を実際に取得しません。 CPythonでは、os.getenv()は、ちょうどos.environ.get()http://hg.python.org/cpython/file/6671c5039e15/Lib/os.py#l646参照)のラッパーです。したがって、os.getenv()を上記の実装で使用する主な理由は、KeyErrorまたは何かスローされたものではなく、os.environのキーに環境変数名が見つからない場合に返されるデフォルト値を持ちたい場合です。いくつかの文字を保存します。

FreeBSD上の実装には違った動作をさせる奇妙な仕掛けがあるかもしれませんが、なぜそうなるのか分かりません。可能であれば、使用しているFreeBSDマシンの1つにあるos.pyのコピーを見てください。

+0

Windows 10では、 'os.putenv( 'abc'、 '123')'は機能しませんでした。つまり、新しい変数が設定されていません。しかし、 'os.environ ['abc'] = '123''が動作し、' os.getenv(' abc ') 'も同様に動作します。 –

+1

@arvindpdmnもう一度調べてみると、 'putenv()'は実際に 'os.environ'に環境変数を格納していないからです。 'environ .__ setitem __()'は 'putenv()'を呼び出し、データをローカルに保存します。 'getenv()'や 'environ .__ getitem __()'は実際に環境自身に問い合わせるのではなく、 .environ'が保存されています。それを実装するための非常に混乱する方法。 – JAB

関連する問題