Quand os.environ['foo'] correspond pas à l'os.la fonction getenv('foo')?
J'ai une petite application en Python, lancé par subprocess.Popen
, qui prend un peu de paramètres sous la forme de variables d'environnement. Je fais cela en passant de l'environnement dans la structure du Popen
appel. Ensuite, le programme lit les variables via os.getenv
.
Ou plutôt, c'est l'habitude de lire de cette façon. Sur Windows, il a bien fonctionné. Mais sur nos serveurs FreeBSD, os.getenv
retourne None
pour tous les paramètres, nous avons passé en. L'étrange, c'est que os.environ
a des valeurs très bien—et, en effet, il suffit de passer tous os.getenv('foo')
appels à os.environ['foo']
fait tout fonctionne bien sur les deux plates-formes.
Pourquoi ces valeurs sont-elles différentes? Quand un approprié sur l'autre?
Vous devez vous connecter pour publier un commentaire.
os.environ
est créé lors de l'importation de laos
module, et ne pas refléter les changements de l'environnement qui se produisent par la suite à moins d'être modifiées directement. Fait intéressant à noter, cependant,os.getenv()
n'est pas la plus récente des variables d'environnement, du moins, pas dans Disponible. Voyez-vous, dans Disponible,os.getenv()
est apparemment juste un wrapper autour deos.environ.get()
(voir http://hg.python.org/cpython/file/6671c5039e15/Lib/os.py#l646). Il semble donc que la raison principale de l'utilisationos.getenv()
à la mise en œuvre est quand vous voulez avoir une valeur par défaut retournée lorsqu'un nom de variable d'environnement n'est pas trouvé dansos.environ
les clés plutôt que d'avoir unKeyError
ou quel que soit levée, et que vous voulez économiser quelques caractères.Il est tout à fait possible que la mise en œuvre sur FreeBSD a certains truc bizarre qui le force à agir différemment, mais je ne suis pas sûr pourquoi ce serait le cas. Jetez un oeil à la copie de
os.py
sur l'une des machines FreeBSD que vous utilisez, si vous le pouvez.os.putenv('abc', '123')
n'a pas de travail, c'est la nouvelle variable n'est pas définie. Cependant,os.environ['abc'] = '123'
œuvres et par la suiteos.getenv('abc')
fonctionne aussi bien.putenv()
ne fait pas stocker la variable d'environnement dansos.environ
; plutôt,environ.__setitem__()
appelsputenv()
et stocke également les données localement, et nigetenv()
nienviron.__getitem__()
vraiment une requête de l'environnement lui-même, ils travaillent à partir de ceos.environ
a stocké. Tout à fait d'une manière confuse pour la mettre en œuvre.