Pythonスクリプトでいくつかの環境変数を設定する必要があります。また、Pythonから呼び出される他のすべてのスクリプトで環境変数が設定されていることを確認します。
私が行った場合
os.environ["DEBUSSY"] = 1`
それは1
文字列である必要があると不平を言う。
また、Pythonの環境変数を(スクリプトの後の部分で)設定した後、それを読み取る方法も知りたいです。
Pythonスクリプトでいくつかの環境変数を設定する必要があります。また、Pythonから呼び出される他のすべてのスクリプトで環境変数が設定されていることを確認します。
私が行った場合
os.environ["DEBUSSY"] = 1`
それは1
文字列である必要があると不平を言う。
また、Pythonの環境変数を(スクリプトの後の部分で)設定した後、それを読み取る方法も知りたいです。
回答:
環境変数は文字列でなければならないので、
os.environ["DEBUSSY"] = "1"
変数DEBUSSY
を文字列に設定します1
。
この変数に後でアクセスするには、次のコードを使用します。
print(os.environ["DEBUSSY"])
子プロセスは、親プロセスの環境変数を自動的に継承します。ユーザー側で特別なアクションを行う必要はありません。
putenv()
が、それらのUnixenにはとにかくできることは何もありません。私が使用していた古いバージョンのAIXとHPUXでもサポートしていました。今日誰かがそれをサポートしていないコンピューターを実際に見つけることができるなら、私は彼らがそのコンピューターでPythonを実行することができるかどうか深刻な疑いがあります。:)
コードの堅牢性については、さらにいくつかの側面を考慮する必要があるかもしれません。
整数値の変数を環境変数として保存する場合は、
os.environ['DEBUSSY'] = str(myintvariable)
次に、取得のために、エラーを回避するために、
os.environ.get('DEBUSSY', 'Not Set')
'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)
myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None
–番号が提供されない場合はそれでNoneになる
value_not_set = '-1'
。その後、使用できますdebussy = int(os.environ.get('DEBUSSY', value_not_set))
os.environ
Pythonディクショナリのように動作するため、一般的なすべてのディクショナリ操作を実行できます。他の回答に記載されているget
とset
操作に加えて、キーが存在するかどうかを簡単に確認することもできます。キーと値は文字列として保存する必要があります。
Python 3
Python 3の場合、辞書はhas_keyの代わりにinキーワードを使用します
>>> import os
>>> 'HOME' in os.environ # Check an existing env. variable
True
...
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'
使用に関して注意すべき重要なことが1つありますos.environ
。
子プロセスは親プロセスから環境を継承しますが、最近問題に遭遇しました。Pythonスクリプトの実行中に他のスクリプトが環境を更新している場合、os.environ
再度呼び出しても最新の値が反映されません。
ドキュメントからの抜粋:
このマッピングは、osモジュールが最初にインポートされたときに、通常はPythonの起動時にsite.pyの処理の一部としてキャプチャされます。この時間以降に行われた環境への変更は、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.data
Python 3.2 でに名前が変更されましos.environ._data
た。アンダースコアの接頭辞は、直接読み取るべきではないことを示しています。とにかく、os.environ._data
値が更新されることはありません。
変数を設定するには:
キーを使用したアイテムの割り当て方法:
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
文字列値を環境変数に割り当てる必要があります。
os.environ["DEBUSSY"] = "1"
環境変数を読み取りまたは印刷したい場合は、
print os.environ["DEBUSSY"]
この変更は、割り当てられた現在のプロセスに対してのみ有効であり、値を永続的に変更することはありません。子プロセスは、親プロセスの環境を自動的に継承します。
set [<name>=[<value>]]
が、それは現在実行中のプロセスに対してのみ行われます。私がcmdを閉じるとき、それは存在せず、それが開いているときでさえ、他のプログラムはそれを見ることができません。
環境変数を追加しようとしています。私の目標は、構成ファイルの代わりとして、将来のソリューションでこれらの変数を使用できるように、いくつかのユーザー情報をシステム変数に格納することでした。ただし、以下のコードで説明されている方法はまったく役に立ちませんでした。
import os
os.environ["variable_1"] = "value_1"
os.environ["variable_2"] = "value_2"
# To Verify above code
os.environ.get("variable_1")
os.environ.get("variable_2")
この単純なコードブロックは適切に機能しますが、これらの変数はそれぞれのプロセス内に存在するため、Windowsシステム設定の[環境変数]タブには表示されません。上記のコードのほとんどは私の目的を果たしませんでした。この問題については、ここで説明します:変数の保存の問題
os.environ.putenv(key, value)
別の失敗した試み。したがって、最後に、osパッケージのシステムクラス内にラップされたWindowsシェルコマンドを模倣することにより、ウィンドウ環境レジスタ内に変数を正常に保存することができました。次のコードは、この成功した試みを示しています。
os.system("SETX {0} {1} /M".format(key, value))
これがあなたの一部に役立つことを願っています。
あなたがbashの評価に環境変数を設定しようとすると、それがあることに注意すべきではないでしょう、あなたが期待するもの格納します。例:
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(f"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(f"Error: Unable to find environment variable {bash_variable}")
あなたは使用することができos.environ
、あなたの環境変数にアクセスするための辞書を。
今、私が持っていた問題os.system
は、環境変数を設定するバッチファイルを実行しようとした場合(**。bat *ファイルのSETコマンドを使用)、実際にはそれらを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