1. ホーム
  2. python

[解決済み] python os.environ, os.putenv, /usr/bin/env

2022-02-15 18:32:39

質問

を確保したい。 os.system('env') 特定の変数が含まれない myname でエクスポートされる ~/.bashrc として export myname=csj

そこで、以下のようなPythonのコードを書きました。

import os

def print_all():
    print "os.environ['myname']=%s" % os.environ.get('myname')
    print "os.getenv('myname')=%s" % os.getenv('myname')
    os.system('env | grep myname')
    print

def delete_myname():
    if 'myname' in os.environ: os.environ.pop('myname')
    if os.getenv('myname'): os.unsetenv('myname')

print_all()

os.putenv('myname', 'csj2')
print "---------------------"
delete_myname()
print_all()

os.putenv('myname', 'csj3')
print "---------------------"
delete_myname()
print_all()

という2つの項目を検討する必要があると思います。 os.environ['myname']os.getenv('myname') を実行し、存在すれば削除する。 を確保することができます。 os.system('env | grep myname') は何も得られない。

ところが、その結果は

os.environ['myname']=csj
os.getenv('myname')=csj
myname=csj

---------------------
os.environ['myname']=None
os.getenv('myname')=None

---------------------
os.environ['myname']=None
os.getenv('myname')=None
myname=csj3

なぜか、まだ csj3os.system('env | grep myname') ?

解決方法は?

からの ドキュメント :

putenv()を直接呼び出してもos.environは変更されないので、os.environを修正した方が良い。

について unsetenv 同様のワーニングがあります。

しかし、unsetenv() の呼び出しは os.environ を更新しないので、実際には os.environ のアイテムを削除することが望ましいです。

getenv から値を返すだけです。 os.environ であるため の実装では というように、実際の環境では設定されているのに、pythonから調べると値が設定されていないように見えるという状態に陥ります。今考えられる唯一の方法は、ctypesを使ってcのgetenv関数を呼び出すことでしょうか...。

もし私があなたのコードを修正して os.environ を呼び出す代わりに putenv / unsetenv はすべて期待通りに動作します。

import os

def print_all():
    print "os.environ['myname']=%s" % (os.environ['myname'] if 'myname' in os.environ else "None")
    os.system('env | grep myname')
    print

def delete_myname():
    if 'myname' in os.environ: os.environ.pop('myname')

print_all()

os.environ['myname'] = 'csj2'
print "---------------------"
print_all()
delete_myname()
print_all()

os.environ['myname'] = 'csj3'
print "---------------------"
print_all()
delete_myname()
print_all()

を出力します。

$ myname=somevalue python2 test.py 
os.environ['myname']=somevalue
myname=somevalue

---------------------
os.environ['myname']=csj2
myname=csj2

os.environ['myname']=None

---------------------
os.environ['myname']=csj3
myname=csj3

os.environ['myname']=None