1. ホーム
  2. python

[解決済み] Python os.environがキーエラーを投げる?

2022-02-18 19:07:13

質問

スクリプトで環境変数にアクセスする際に os.environ.get を投げています。 KeyError . Pythonのプロンプトからはエラーは投げられません。OS X 10.11.6、Python 2.7.10で動作しています。

どうなっているのでしょうか?

$ python score.py
Traceback (most recent call last):
  File "score.py", line 4, in <module>
    setup_logging()
  File "/score/log.py", line 29, in setup_logging
    config = get_config()
  File "/score/log.py", line 11, in get_config
    environment = os.environ.get('NODE_ENV')
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/UserDict.py", line 23, in __getitem__
    raise KeyError(key)
KeyError: 'NODE_ENV'
$ python -c "import os; os.environ.get('NODE_ENV')"
$

リクエストに応えて、次のようなソースコードです。 score.py

from __future__ import print_function

from log import get_logger, setup_logging
setup_logging()
log = get_logger('score')

そして、こちらが log.py

import json
import os
import sys

from iron_worker import IronWorker
from logbook import Logger, Processor, NestedSetup, StderrHandler, SyslogHandler

IRON_IO_TASK_ID = IronWorker.task_id()

def get_config():
  environment = os.environ.get('NODE_ENV')
  if environment == 'production':
    filename = '../config/config-production.json'
  elif environment == 'integration':
    filename = '../config/config-integration.json'
  else:
    filename = '../config/config-dev.json'

  with open(filename) as f:
    return json.load(f)

def setup_logging():
  # This defines a remote Syslog handler
  # This will include the TASK ID, if defined
  app_name = 'scoreworker'
  if IRON_IO_TASK_ID:
    app_name += '-' + IRON_IO_TASK_ID

  config = get_config()

  default_log_handler = NestedSetup([
    StderrHandler(),
    SyslogHandler(
      app_name,
      address = (config['host'], config['port']),
      level = 'ERROR',
      bubble = True
    )
  ])
  default_log_handler.push_application()

def get_logger(name):
  return Logger(name)

解決方法は?

実行してみてください。

find . -name \*.pyc -delete

を削除するには .pyc ファイルを作成します。

あなたの問題を調査しているとき、私は以下のものに出会いました。 この質問 同じようなことを経験したユーザーがいました。 .get() を提起しているように見える。 KeyError . その場合、原因は、曰く この回答は によるものである。 .pyc ファイルには dict の値がキーでアクセスされていた (すなわち。 mydict['potentially_nonexistent_key'] のコードが表示され、トレースバックには更新された .py ファイルでは .get() が使用されました。このようなことは聞いたことがありません トレースバックが現在のコードを参照するのは .py ファイルによって引き起こされたエラーが表示されます。 .pyc というファイルがありますが、Pythonの歴史の中で少なくとも一度は起こったことがあるようです...。

望みは薄いですが、試してみる価値はあると思いました。