web-dev-qa-db-ja.com

Pythonで環境変数を設定する方法

私はpythonスクリプトでいくつかの環境変数を設定する必要があり、私は環境変数が設定されているのを見るために子プロセスとなるpython(シェルスクリプト)から呼び出される他のすべてのスクリプトが欲しいのです。値は数値です。

私がos.environ["DEBUSSY"] = 1をするならば、それは1が文字列でなければならないと言って不平を言います。設定したら、Pythonの環境変数(スクリプトの後半部分)の読み方も知りたいです。

464
prahallada

環境変数は文字列でなければならないので、

os.environ["DEBUSSY"] = "1"

変数DEBUSSYを文字列1に設定します。後でこの変数にアクセスするには、単純に

print os.environ["DEBUSSY"]

子プロセスは自動的に親プロセスの環境を継承します - あなたの側に特別な行動は必要ありません。

567
Sven Marnach

コードの堅牢性については、さらにいくつかの側面を考慮する必要があります。

整数値の変数を環境変数として格納するときは、試してみてください。

os.environ['DEBUSSY'] = str(myintvariable)

それから検索のために、エラーを避けるために、あなたは試してみるべきだと考えてください

os.environ.get('DEBUSSY', 'Not Set')

「設定しない」の代わりに「-1」を使用する

そう、それをすべてまとめるために

myintvariable = 1
os.environ['DEBUSSY'] = str(myintvariable)
strauss = int(os.environ.get('STRAUSS', '-1'))
# NB KeyError <=> strauss = os.environ['STRAUSS']
debussy = int(os.environ.get('DEBUSSY', '-1'))

print "%s %u, %s %u" % ('Strauss', strauss, 'Debussy', debussy)
95
Mark

os.environはpython辞書のように動作するため、すべての一般的な辞書操作を実行できます。他の回答で言及されたgetおよびset操作に加えて、キーが存在するかどうかも簡単に確認できます。

Python 2

>>> import os
>>> os.environ.has_key('HOME')  # Check an existing env. variable
True
>>> os.environ.has_key('FOO')   # Check for a non existing variable
False
>>> os.environ['FOO'] = '1'     # Set a new env. variable (String value)
>>> os.environ.has_key('FOO')
True
>>> os.environ.get('FOO')       # Retrieve the value
'1'

Python 3

python 3の場合、辞書はhas_keyの代わりにinキーワードを使用します

>>> import os
>>> 'HOME' in os.environ  # Check an existing env. variable
True
...

os.environの使用について注意すべき重要な点が1つあります。

子プロセスは親プロセスから環境を継承しますが、最近問題に遭遇し、pythonスクリプトの実行中に環境を更新する他のスクリプトがある場合、os.environを再度呼び出していることがわかりましたは最新の値を反映しません

docs からの抜粋:

このマッピングは、osモジュールが最初にインポートされるときにキャプチャされます。通常は、site.pyの処理の一部としてPython起動時にキャプチャされます。この時間以降に行われた環境への変更は、os.environに直接変更を加えた場合を除き、os.environには反映されません。

os.environ.dataはすべての環境変数を保存し、すべての環境値を含むdictオブジェクトです。

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>
45
sisanared

os.environ ["DEBUSSY"] = 1を実行した場合、1は文字列でなければならないと文句を言われます。

それから

os.environ["DEBUSSY"] = "1"

私はそれを設定したら私はまた、Pythonの環境変数を(スクリプトの後半部分で)読む方法を知りたいです。

次のようにos.environ["DEBUSSY"]を使うだけです。

some_value = os.environ["DEBUSSY"]
18
Jim Brissom

環境変数に文字列値を代入する必要があります。

os.environ["DEBUSSY"] = "1"

環境変数を読んだり印刷したい場合は、

print os.environ["DEBUSSY"]

この変更は、それが割り当てられた現在のプロセスに対してのみ有効であり、値を恒久的に変更することはありません。子プロセスは自動的に親プロセスの環境を継承します。

enter image description here

17
RejeeshChandran

os.environ["DEBUSSY"] = '1'はどうですか?環境変数は常に文字列です。

14
ThiefMaster

あなたの環境変数にアクセスするためにos.environ辞書を使うことができます。

今、私が抱えていた問題は、(**。bat *ファイルでSETコマンドを使用して)環境変数を設定するバッチファイルをos.systemで実行しようとしても、実際にはPython環境には設定されないということです。 os.system関数で作成された子プロセスの場合)実際にpython環境で設定された変数を取得するために、私はこのスクリプトを使います:

import re
import system
import os

def setEnvBat(batFilePath, verbose = False):
    SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE)
    SetEnvFile = open(batFilePath, "r")
    SetEnvText = SetEnvFile.read()
    SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText)

    for SetEnvMatch in SetEnvMatchList:
        VarName=SetEnvMatch[0]
        VarValue=SetEnvMatch[1]
        if verbose:
            print "%s=%s"%(VarName,VarValue)
        os.environ[VarName]=VarValue
10
Ricardo Alejos

環境変数(変数の追加/変更/削除)を使用するときは、関数の完了時に前の状態を復元することをお勧めします。

環境変数を復元するには、この question に記述されているmodified_environコンテキストマネージャのようなものが必要です。

古典的な使い方

with modified_environ(DEBUSSY="1"):
    call_my_function()
7
Laurent LAPORTE

変数を設定する方法:

キーを使用したアイテムの割り当て方法:

import os    
os.environ['DEBUSSY'] = '1'  #Environ Variable must be string not Int

存在するかどうかを確認する

os.environ はインスタンスなので、オブジェクトの方法で試すことができます。

方法1:

os.environ.get('DEBUSSY') # this is error free method if not will return None by default

戻り値として'1'を取得します

方法2:

os.environ['DEBUSSY'] # will throw an key error if not found!

方法3:

'DEBUSSY' in os.environ  # will return Boolean True/False

方法4:

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements
3

環境変数をbash評価に設定しようとすると、wo n't期待したものを保存することに注意してください。例:

from os import environ

environ["Java_HOME"] = "$(/usr/libexec/Java_home)"

これは、シェルの場合のようには評価されないため、パスとして/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Homeを取得する代わりに、リテラル式$(/usr/libexec/Java_home)を取得します。

次のように、環境変数を設定する前に必ず評価してください。

from os import environ
from subprocess import Popen, PIPE

bash_variable = "$(/usr/libexec/Java_home)"
capture = Popen("echo " + bash_variable, stdout=PIPE, Shell=True)
std_out, std_err = capture.communicate()
return_code = capture.returncode

if return_code == 0:
    evaluated_env = std_out.decode().strip()
    environ["Java_HOME"] = evaluated_env
else:
    print("Error: Unable to find environment variable " + bash_variable)
2
Josh Correia