使用临时环境变量运行Python脚本

时间:2019-07-12 14:55:46

标签: python environment-variables

我有一个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模块中添加额外的代码或向本地计算机系统添加环境变量?

2 个答案:

答案 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'