私はpythonスクリプトでいくつかの環境変数を設定する必要があり、私は環境変数が設定されているのを見るために子プロセスとなるpython(シェルスクリプト)から呼び出される他のすべてのスクリプトが欲しいのです。値は数値です。
私がos.environ["DEBUSSY"] = 1
をするならば、それは1
が文字列でなければならないと言って不平を言います。設定したら、Pythonの環境変数(スクリプトの後半部分)の読み方も知りたいです。
環境変数は文字列でなければならないので、
os.environ["DEBUSSY"] = "1"
変数DEBUSSY
を文字列1
に設定します。後でこの変数にアクセスするには、単純に
print os.environ["DEBUSSY"]
子プロセスは自動的に親プロセスの環境を継承します - あなたの側に特別な行動は必要ありません。
コードの堅牢性については、さらにいくつかの側面を考慮する必要があります。
整数値の変数を環境変数として格納するときは、試してみてください。
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)
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'>
os.environ ["DEBUSSY"] = 1を実行した場合、1は文字列でなければならないと文句を言われます。
それから
os.environ["DEBUSSY"] = "1"
私はそれを設定したら私はまた、Pythonの環境変数を(スクリプトの後半部分で)読む方法を知りたいです。
次のようにos.environ["DEBUSSY"]
を使うだけです。
some_value = os.environ["DEBUSSY"]
os.environ["DEBUSSY"] = '1'
はどうですか?環境変数は常に文字列です。
あなたの環境変数にアクセスするために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
環境変数(変数の追加/変更/削除)を使用するときは、関数の完了時に前の状態を復元することをお勧めします。
環境変数を復元するには、この question に記述されているmodified_environ
コンテキストマネージャのようなものが必要です。
古典的な使い方
with modified_environ(DEBUSSY="1"):
call_my_function()
変数を設定する方法:
キーを使用したアイテムの割り当て方法:
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
環境変数を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)