web-dev-qa-db-ja.com

pythonで使用できない環境変数

環境変数に関してかなり興味深い問題があり、グーグルで検索しても意味のある結果は表示されませんでした。

$ echo $BUCKET && python -c "import os; print os.environ['BUCKET']"
mule-uploader-demo
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__
    raise KeyError(key)
KeyError: 'BUCKET'

だから私はbashで利用できるがPythonの内部では利用できない環境変数を持っています。これはどのように起こり、どのように修正すればよいですか?追加の詳細は次のとおりです。

  • 環境変数は、source envvars.shコマンドを使用して設定されます
  • envvars.shファイルには、次のような行のみが含まれています:KEY=value
  • これをbashとzshの両方で再現しました
  • export BUCKET=$BUCKETを実行すると、機能します
4
Gabi Purcaru

これは、bashの可変スコープと関係があります。 exportは、変数をサブプロセスで使用できるようにします。次に例を参照してください。

→ export BUCKET=foo 
→ env | grep BUCKET
80:BUCKET=foo
→ PAIL=bar  
→ env | grep PAIL  # no output
→ python -c "import os; print os.environ['BUCKET']"
foo
→ python -c "import os; print os.environ['PAIL']"  
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "...", line 23, in __getitem__
    raise KeyError(key)
KeyError: 'PAIL'
→ CAN=baz python -c "import os; print os.environ['CAN']"
baz

したがって、子プロセスではPAILは失敗します。

3
c4urself