从 shell 脚本加载环境变量

7
我有一个包含一些环境变量的文件,我想在Python脚本中使用它们。以下命令行代码是有效的:
$ source myFile.sh
$ python ./myScript.py

我可以从Python脚本内部访问变量,例如:

import os
os.getenv('myvariable')

如何在Python脚本中调用并访问Shell脚本中的变量?请帮我翻译这段内容。

你是什么意思?你是指如何“设置”环境变量? - jonrsharpe
我想从Python脚本内部调用 "source myFile.sh",然后访问变量。 - lafferc
所以,你只是想知道如何从Python运行一个命令吗?你尝试过搜索“那个”了吗? “加载环境变量”似乎与你想要实现的目标完全无关 - jonrsharpe
我知道如何从Python中运行Bash命令,但是否有一种内置的方法来源文件? - lafferc
2个回答

9

如果你说的是反向环境传播,很抱歉,你不能这样做。这是一个安全问题。然而,直接从Python中获取环境变量是绝对有效的。但这更多或少是一个手动过程。

import subprocess as sp

SOURCE = 'your_file_path'
proc = sp.Popen(['bash', '-c', 'source {} && env'.format(SOURCE)], stdout=sp.PIPE)

source_env = {tup[0].strip(): tup[1].strip() for tup in map(lambda s: s.strip().split('=', 1), proc.stdout)}

那么您在 source_env 中拥有所需的一切。

如果您需要将其写回到本地环境(不建议这样做,因为 source_env 可以让您保持干净):

import os

for k, v in source_env.items():
    os.environ[k] = v

这里需要注意的另一个小问题是,由于我在这里调用了bash,因此你应该期望这些规则也适用于这里。因此,如果你想让变量可见,你需要将它们导出。

export VAR1='see me'
VAR2='but not me'

1
这对于所有可能的环境变量值都不会正常工作--env的输出并不打算被明确地解析。 - Charles Duffy
1
@CharlesDuffy 是的,这里存在一些特殊情况。实际处理这种情况的一种可能方式是需要另一个脚本,该脚本打印由“\0”分隔的“k=v”。 - Jason Hu
确实。如果只需要支持Linux操作系统,甚至可以使用cat /proc/self/environ命令来输出完全相同的格式。 :) - Charles Duffy

-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接