pra*_*ada 564 python environment-variables
我需要在python脚本中设置一些环境变量,我希望从python(shell脚本)调用的所有其他脚本都是子进程,以查看环境变量集.该值是一个数字.
如果我这样做os.environ["DEBUSSY"] = 1,它抱怨说1必须是字符串.我也想知道在设置之后如何在python中读取环境变量(在脚本的后面部分).
Sve*_*ach 679
环境变量必须是字符串,所以使用
os.environ["DEBUSSY"] = "1"
Run Code Online (Sandbox Code Playgroud)
将变量DEBUSSY设置为字符串1.要稍后访问此变量,只需使用
print(os.environ["DEBUSSY"])
Run Code Online (Sandbox Code Playgroud)
子进程自动继承父进程的环境 - 您无需执行任何特殊操作.
Mar*_*ark 106
您可能需要考虑代码稳健性的其他方面;
当您将整数值变量存储为环境变量时,请尝试
os.environ['DEBUSSY'] = str(myintvariable)
Run Code Online (Sandbox Code Playgroud)
然后进行检索,考虑避免错误,你应该尝试
os.environ.get('DEBUSSY', 'Not Set')
Run Code Online (Sandbox Code Playgroud)
可能用'-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)
Run Code Online (Sandbox Code Playgroud)
sis*_*red 49
os.environ行为类似于python字典,因此可以执行所有常见的字典操作.除了其他答案中提到的get和set操作之外,我们还可以简单地检查是否存在密钥
Python 2
>>> import os
>>> 'HOME' in os.environ # Check an existing env. variable
True
...
Run Code Online (Sandbox Code Playgroud)
Python 3
对于python 3,字典使用in关键字而不是has_key
>>> 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'
Run Code Online (Sandbox Code Playgroud)
关于使用有一个重要的注意事项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'>
Run Code Online (Sandbox Code Playgroud)
Sou*_*sai 28
在使用此方法之前,请浏览评论部分
我一直在尝试添加环境变量。我的目标是将一些用户信息存储到系统变量中,以便我可以将这些变量用于未来的解决方案,作为配置文件的替代方案。但是,下面代码中描述的方法根本没有帮助我。
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")
Run Code Online (Sandbox Code Playgroud)
这个简单的代码块运行良好,但是,这些变量存在于各自的进程中,因此您不会在 Windows 系统设置的环境变量选项卡中找到它们。上面的代码几乎没有达到我的目的。这里讨论这个问题:变量保存问题
os.environ.putenv(key, value)
Run Code Online (Sandbox Code Playgroud)
又一次失败的尝试。所以,最后,我通过模仿包装在 os 包的系统类中的 windows shell 命令,成功地将变量保存在 windows 环境寄存器中。下面的代码描述了这次成功的尝试。
os.system("SETX {0} {1} /M".format(key, value))
Run Code Online (Sandbox Code Playgroud)
我希望这会对你们中的一些人有所帮助。
Jim*_*som 20
如果我做os.environ ["DEBUSSY"] = 1,它抱怨说1必须是字符串.
然后做
os.environ["DEBUSSY"] = "1"
Run Code Online (Sandbox Code Playgroud)
我也想知道如何设置它后如何在python中读取环境变量(在脚本的后半部分).
就像使用os.environ["DEBUSSY"]一样
some_value = os.environ["DEBUSSY"]
Run Code Online (Sandbox Code Playgroud)
Rej*_*ran 15
您应该将字符串值分配给环境变量.
os.environ["DEBUSSY"] = "1"
如果您想阅读或打印环境变量,请使用
print os.environ["DEBUSSY"]
此更改仅对分配给它的当前进程有效,不会永久更改该值.子进程将自动继承父进程的环境.
Moh*_*med 14
to Set Variable:
item Assignment method using key:
import os
os.environ['DEBUSSY'] = '1' #Environ Variable must be string not Int
Run Code Online (Sandbox Code Playgroud)
to get or to check whether its existed or not,
since os.environ is an instance you can try object way.
Method 1:
os.environ.get('DEBUSSY') # this is error free method if not will return None by default
Run Code Online (Sandbox Code Playgroud)
will get '1' as return value
Method 2:
os.environ['DEBUSSY'] # will throw an key error if not found!
Run Code Online (Sandbox Code Playgroud)
Method 3:
'DEBUSSY' in os.environ # will return Boolean True/False
Run Code Online (Sandbox Code Playgroud)
Method 4:
os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements
Run Code Online (Sandbox Code Playgroud)
小智 10
您可以使用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
Run Code Online (Sandbox Code Playgroud)
当您使用环境变量(添加/修改/删除变量)时,一个好的做法是在功能完成时恢复先前的状态.
您可能需要类似modified_environ上下文管理器在此问题中描述的内容来恢复环境变量.
经典用法:
with modified_environ(DEBUSSY="1"):
call_my_function()
Run Code Online (Sandbox Code Playgroud)
小智 8
像这样设置环境变量:
import os
# Set environment variables
os.environ['API_USER'] = 'username'
os.environ['API_PASSWORD'] = 'secret'
# Get environment variables
USER = os.getenv('API_USER')
PASSWORD = os.environ.get('API_PASSWORD')
Run Code Online (Sandbox Code Playgroud)
应当注意,如果您尝试将环境变量设置为bash评估,它将不会存储您期望的结果。例:
from os import environ
environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"
Run Code Online (Sandbox Code Playgroud)
这不会像在shell中那样对它求值,因此,您无需获取/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)
Run Code Online (Sandbox Code Playgroud)
如果环境中不存在变量,请使用setdefault函数设置新变量。
确保将环境变量设置为字符串,而不是整数。否则会扔 TypeError。
import os
if not os.environ.get("DEBUSSY"):
os.environ.setdefault("DEBUSSY","1")
else:
os.environ["DEBUSSY"] = "1"
print(os.environ["DEBUSSY"])
Run Code Online (Sandbox Code Playgroud)
管理用户定义的环境变量的一种巧妙方法是将它们全部放入文本文件中并在运行时加载它们。我们可以使用python-dotenv包来实现这一点,它允许我们导入这些变量。该软件包可以通过以下方式安装:
pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)
默认情况下,模块在当前目录中查找名为.env的文件。在此文件中定义所有变量,每行一个,如下所示:
DEBUSSY=1
PATH_TO_EXECUTABLE=/home/user_name/project/run.sh
Run Code Online (Sandbox Code Playgroud)
然后将它们导入您的环境,如下所示:
from dotenv import load_dotenv
load_dotenv()
print(os.getenv('DEBUSSY'))
Run Code Online (Sandbox Code Playgroud)
您可以将包含已定义变量的文件的路径指定为load_dotenv的可选参数。随后,可以通过os模块访问这些环境变量,如其他一些响应中所述。
| 归档时间: |
|
| 查看次数: |
633535 次 |
| 最近记录: |