Python os.environ jette une erreur de clé?
Je suis d'accéder à une variable d'environnement dans un script avec os.environ.get
et c'est jeter un KeyError
. Il ne jette pas l'erreur de l'interprète Python. C'est en cours d'exécution sur OS X 10.11.6, et est Python 2.7.10.
Ce qui se passe?
$ 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')"
$
Comme demandé, voici le code source pour score.py
from __future__ import print_function
from log import get_logger, setup_logging
setup_logging()
log = get_logger('score')
Et voici 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)
Pouvez-vous fournir le code pour
Ne peuvent pas se reproduire...
C'est bizarre.
Pourriez-vous être confronté à ceci: stackoverflow.com/a/26906934/3642398? Je ne savais pas ce qui pourrait arriver (stacktrace indiquant le code, mais l'exécution de code de
Ouais, c'est à quoi il ressemble sur mon local python installer trop (2.7.10). Mais la chose étrange est que
score.py
?Ne peuvent pas se reproduire...
C'est bizarre.
get
ne devrait jamais jeter un KeyError
; il est censé retourner None
si la clé n'est pas trouvé (ou quelle que soit la valeur par défaut que vous avez fournies si vous avez fourni un). Heck, le code source pour cette méthode n'est même pas censé avoir un raise KeyError(key)
ligne à tous!Pourriez-vous être confronté à ceci: stackoverflow.com/a/26906934/3642398? Je ne savais pas ce qui pourrait arriver (stacktrace indiquant le code, mais l'exécution de code de
.pyc
fichier), mais semble être ce que l'utilisateur est en train de décrire.Ouais, c'est à quoi il ressemble sur mon local python installer trop (2.7.10). Mais la chose étrange est que
UserDict.get
(ligne 61 en UserDict.py) doit être dans le traceback -- Mais je ne suis pas le voir. C'est presque comme quelqu'un singe patché UserDict.get = UserDict.__getitem__
, mais ce serait une très ombragé chose à faire...
OriginalL'auteur Chris B. | 2016-09-01
Vous devez vous connecter pour publier un commentaire.
Essayez de lancer:
Pour supprimer votre
.pyc
fichiers.La recherche de votre problème, je suis tombé sur cette question, où un utilisateur a été l'expérience de la même chose:
.get()
apparemment élever unKeyError
. Dans ce cas, elle a été causée, selon ce accepté de répondre à, par un.pyc
fichier qui contenait code où undict
valeur était accessible par clé (c'est à dire,mydict['potentially_nonexistent_key']
), tandis que le traceback était indiquant le code de la mise à jour.py
fichier où.get()
a été utilisé. Je n'ai jamais entendu parler de ce qui se passe, où le traceback références actuelles du code à partir d'un.py
fichier, mais affiche une erreur soulevée par la vétusté des.pyc
fichier, mais il semble avoir eu lieu au moins une fois dans l'histoire de Python...C'est un long shot, mais vaut la peine d'essayer je ne le pensais.
absolument. J'ai obtenu brûlé par les questions connexes, mais celui-ci en particulier, c'était nouveau pour moi.
Ne fonctionne pas pour moi.. Jusqu'à ce que je suis sorti et rechargé mon IDE après l'ajout de la variable d'environnement (VS Code)
OriginalL'auteur elethan
Je vous recommande de démarrer le débogage os.py par exemple, sur windows, il est utilisé de cette mise en œuvre:
Et si je l'ai tester avec ceci:
La sortie sera:
Donc il est logique de l'exception n'est pas donné naissance à la lecture de dict.obtenez de l' docs.
En tout cas, si vous ne voulez pas gâcher le débogage ou les modules python, essayez de nettoyer le *.pyc fichiers, essayez de configurer correctement
NODE_ENV
. Et si tout cela ne fonctionne pas, redémarrez votre terminal.os.environ.get
. bien sûr cela peut jeter uneKeyError
. Ce n'est pas à la controverse ou inattendu.“j'ai été en mesure de reproduire l'exception avec ce complètement différent de code” – Comment est-ce que de l'aide pour résoudre des OP problème?
Code différent? Allez, c'est la même exception et je pense que j'ai donné la solution
Why not trying setting properly that NODE_ENV var?
, de confirmer que le premier... et puis il suffit de downvote, soupir... 😛Je peux obtenir la même exception de faire
raise KeyError('NODE_ENV')
– Est ce utile? Pas de. L'OP est à l'aide d'une manière très différente d'accéder à la variable d'environnement que vous, d'une manière qui devrait pas déclencher une exception lorsque la clé n'existe pas. C'est le problème que veut être résolu ici.Mais l'appel de
.get
est un moyen d'éviter de l'exception! Et il n'est pas de travail.OriginalL'auteur BPL