rcmdnk's blog

Amazon.co.jp: ゲームを作りながら楽しく学べるPythonプログラミング (Future Coders(NextPublishing)) eBook: 田中 賢一郎: Kindleストア

Pythonで環境変数を取得する方法について。 下の例はPython 2.7.14で試しています。

os.environ.get()

os.environ.get()を使えばシェルで定義された環境変数を取ってこれます。

1
2
3
4
5
#!/usr/bin/env python

import os
home = os.environ.get("HOME", "")
print home

2番めの引数はもし$HOMEが設定されてない時に代わりに与えるデフォルト値になります。 省略するとNoneに。

subprocessの中でechoする

単独の変数であればos.environ.get()を使うべきですが、 シェルスクリプト的な書き方をしてあるファイルで 変数が文字列の中に混じっている様なものを変換したい時はちょっと面倒です。

${HOME}の様に{}で囲ってあればその部分を抜き出してやろうと思えば出来ないことも無いですが、 {}にも囲まれて無いような場合はかなり面倒です。

そこでsubprocessを使ってその中で文をechoしてその返り値を使う、という方法を使うと簡単に取ってこれます。

1
2
3
4
5
6
#!/usr/bin/env python

import subprocess
p = subprocess.Popen("echo $HOME", stdout=subprocess.PIPE, shell=True)
home = p.stdout.readline().rstrip()
print home

これで/home/userの様なHOMEの値が取得できます。

Popenでデフォルトのshell=Falseな状態では第一引数はコマンドとそれぞれの引数に分けた 配列で渡しますが、 この場合シェルを通さずechoコマンドを行う、と言う形になり 変数の解釈が起こりません。

1
2
3
4
5
6
#!/usr/bin/env python

import subprocess
p = subprocess.Popen(["echo", "$HOME"], stdout=subprocess.PIPE)
home = p.stdout.readline().rstrip()
print home

これだと$HOMEとそのまま文字列が返ってきます。

shell=Trueにすることでコマンドがシェルに渡されて実行される形になるので $HOME等の値を解釈した上でコマンドを実行してくれます。

もう少し長い文で(とかechoで直接与えるとエラーが出る様な文字列を 含む可能性がある場合には"で囲います。

1
2
3
4
5
6
7
#!/usr/bin/env python

import subprocess
p = subprocess.Popen('echo "My home is ($HOME)"', stdout=subprocess.PIPE,
                     shell=True)
home = p.stdout.readline().rstrip()
print home

何回も使うなら、

1
2
3
4
5
def parse_env(val):
    import subprocess
    p = subprocess.Popen('echo "' + x + '"', stdout=subprocess.PIPE,
                         shell=True)
    return p.stdout.readline().rstrip()

の様に関数にしておけばparse_env("My home is ($HOME)") の様な感じで文字列中の環境変数を取ってくる事が出来る様になります。

Sponsored Links
Sponsored Links

« powの.devドメインがChromeで使えなくなったので.testも使える様にする iPhone Xをしばらく使ってみて良かった点とか気になる点とか »

}