38

subprocess.Popen私は、環境変数の形式でいくつかのパラメーターを受け取る小さな Python アプリケーションを 経由で起動しました。Popenこれを行うには、環境構造を呼び出しに渡します。次に、プログラムは を介し​​て変数を読み取りますos.getenv

というか、昔はそう読んでいた。Windows では、問題なく動作しました。しかし、私たちの FreeBSD サーバーでは、渡したすべてのパラメーターに対してos.getenvが返さNoneれます。奇妙な点は、値が適切であることです。実際、すべての呼び出しを にos.environ切り替えるだけで、両方のプラットフォームですべてが正常に機能しました。os.getenv('foo')os.environ['foo']

これらの値が異なるのはなぜですか? 一方が他方よりも適切なのはいつですか?

4

1 に答える 1

27

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()に見つからないときにデフォルト値を返したい場合であり、いくつかを保存したい場合です。文字。os.environKeyError

FreeBSD での実装に奇妙なギミックがあり、動作が異なる可能性は十分にありますが、なぜそうなるかはわかりません。os.py可能であれば、使用している FreeBSD マシンの 1 つにあるのコピーを見てください。

于 2012-06-08T17:06:50.367 に答える