Featured image of post Python3で環境変数の文字列をint型にキャストする方法【os.environ】

Python3で環境変数の文字列をint型にキャストする方法【os.environ】

Python3でos.environから取った環境変数はstr型なので、そのままでは数値として使えません。int関数でキャストする方法と、アルファベットや全角数字を渡したときにどうなるかも試しました♪

960文字

文字列で取れてしまう

お手軽に環境変数を扱える

Pythonを使ってAWSのLambda関数やツールを作成していると、環境変数に設定した値を取得して利用したいというケースが少なからず発生すると思います。

Python3での環境変数の値の取り方は以下のようにとても簡単です。
試しにPYTHONPATHと言う環境変数を取得してみます。

sample.py
import os

env_var = os.environ.get('PYTHONPATH')
print(env_var)

python sample.py
/Users/blogenist/.pyenv/shims/python

存在しない環境変数を指定した場合はNoneが取得されます。

数値はそのままは使えない

ただ、数値を環境変数にもたせている場合はそのまま使おうとすると以下のようになってしまいます。

.env
export LOOP_COUNT=5

sample.py
import os

env_var = os.environ.get('LOOP_COUNT')
for index in range(env_var):
    print(index)

python sample.py
Traceback (most recent call last):
  File "sample.py", line 4, in <module>
    for index in range(env_var):
TypeError: 'str' object cannot be interpreted as an integer

これは、os.environで取得した値がint型ではなくstr型で取得されるPythonの仕様のため、そのままではrange関数の引数に使えない、と言う現象になります。

ですので、int型にキャストする必要があるのですが、Python3では簡単にキャストをすることが出来るのでご紹介致します。

手順

int関数を利用

Pythonには文字列を数値に変換するintメソッドが用意されています。

これを利用することで簡単に文字列数字を数値に直すことができます。

sample.py
import os

env_var = os.environ.get('LOOP_COUNT')
print(f"env_var:{env_var}")

int_val = int(env_var)
print(f"int_val:{int_val}")

for index in range(int_val):
    print(index)

python sample.py
env_var:5
int_val:5
0
1
2
3
4

標準出力上は変わりませんが、しっかりとrange関数に渡せるようになりましたね♪

半角文字列数値以外をint関数に渡すとどうなる?

では、実装ミス等が原因でint関数に文字列数字以外を渡してみましょう。

アルファベットの場合

まずはアルファベットの場合です。

sample.py
import os

env_var = "A"
print(f"env_var:{env_var}")

int_val = int(env_var)
print(f"int_val:{int_val}")

python sample.py
env_var:A
Traceback (most recent call last):
  File "sample.py", line 5, in <module>
    int_val = int(env_var)
ValueError: invalid literal for int() with base 10: 'A'

予想通りエラーが出ましたね。

全角数値の場合

では、次は全角数値の場合です。

sample.py
import os

env_var = "1"
print(f"env_var:{env_var}")

# 比較用半角数字
exa_var = "1"
print(f"exa_var:{exa_var}")

int_val = int(env_var)
print(f"int_val:{int_val}")

python sample.py
env_var:1
exa_var:1
int_val:1

なんと動いてしまいました・・・・!
これは予想外でしたね。

あまり使うケースはないとは思いますが、このケースは念頭に入れておいた方が良いかもしれませんね。

終わりに

以上のように、知っておかないとバグが発生してしまいます。

近年はサーバーレスアーキテクチャや人工知能などでPythonが活躍出来る場が増えてきているので、覚えておくと良いでしょう♪