我有一个Python应用程序,它在Kubernetes配置中利用了环境变量,例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
namespace: default
data:
var1: foo
var2: bar
---
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: default
spec:
containers:
- envFrom:
- configMapRef:
name: my-config
因此,将应用程序进行Docker化并在Kubernetes服务器场上运行时很好。
但是,当在没有Docker和Kubernetes的本地计算机上运行应用程序时,却使用了一个不起眼的命令:
python app.py
即使没有ConfigMap或Pod,我也必须使Python模块使用os.getenv('var1')
查找环境变量。
是否有可能无需在Python模块中添加额外的代码或向本地计算机系统添加环境变量?
答案 0 :(得分:1)
您将需要一个“装载程序”小程序,该程序将使用适当的变量来调用第二个程序。 当然,将其安装在Python中也更加方便,因为所有内容都已经设置好了-但这可能一直存在
#!/usr/bin/env python3
import subprocess
import sys
import yaml
config = yaml.load(open(sys.argv[1]))["data"]
# Instead of "data" here, use the yaml path to the place in the configuration your variables are
cmdline = sys.argv[2:]
if cmdline[0].endswith(".py"):
cmdline.insert(0, sys.executable)
result = subprocess.run(cmdline, env=config)
exit(result.returncode)
(当然,您需要安装一些第三方库才能读取yaml配置文件-我已经使用PyYAML
进行了测试)
如果将上述脚本标记为可执行,则可以直接在命令行中使用它,而无需添加“ python3”前缀-否则,如果将此文件命名为“ runner.py”,则您的命令行可以为
python3 runner.py myconfig.yaml myscript.py parameter1 parameter2 parameter3
如果您需要传递当前环境并只更新脚本中的变量,则可以在.run
调用之前执行此操作:
import os
...
config = yaml.load(...)[...]
config = {**os.environ, **config}
此外,请注意,它将或多或少地使用与运行脚本相同的Python解释器来执行脚本(只需检查字面的“ .py”文件扩展名)-如果您需要更多健壮,建议对目标脚本执行stat并检查其是否可执行-然后直接调用-并且仅将当前的Python解释器用于其他文件。
由于您只有一个脚本作为入口点,并且想要简化3rdy馅饼的运行,因此可以对其进行更改,而不必使用通用的加载器- 在这种情况下,我建议添加一个额外的配置变量,以表明变量已经正确设置-因此,当脚本在其容器中运行时,它什么也不做-否则,它将如上所述加载数据并更新其操作系统。环境。
换句话说,在代码的入口点,执行以下操作:
if not os.environ.get("EVERYTHING_SETUP"):
import yaml
config = yaml.load(open("myconfig.yaml"))["data"]
os.environ.update(config)
答案 1 :(得分:0)
您可以设置环境变量,方法是在os
模块的environ
字典中添加键值对。
import os
os.environ['intended var'] = 'intended value'
样品运行
>>> os.getenv('intended var')
'intended value'