【问题标题】:Load environment variables from a shell script从 shell 脚本加载环境变量
【发布时间】:2015-09-16 00:36:56
【问题描述】:

我有一个文件,其中包含一些我想在 python 脚本中使用的环境变量

以下工作来自命令行

$ source myFile.sh
$ python ./myScript.py

并且从 python 脚本内部我可以访问变量,如

import os
os.getenv('myvariable')

如何获取 shell 脚本,然后使用 python 脚本访问变量?

【问题讨论】:

  • 什么意思?你的意思是你如何设置环境变量?
  • 我想从 python 脚本中调用 'source myFile.sh' 然后访问变量
  • 所以您只想知道如何从 Python 运行命令?您是否尝试过搜索 that“加载环境变量” 似乎完全是您想要实现的目标。
  • 我知道如何从 python 运行 bash 命令,但是有没有内置的方式来获取文件?

标签: python bash shell environment-variables


【解决方案1】:

如果你说的是反向环境传播,对不起,你不能。这是一个安全问题。但是,直接从 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'

【讨论】:

  • 这对于所有可能的环境变量值都无法正常工作——env 的输出并不打算被明确解析。
  • @CharlesDuffy 是的。有极端情况。实际处理它的一种可能方法需要另一个脚本,该脚本打印由\0分隔的k=v
  • 确实如此。如果需要支持的唯一操作系统是 Linux,甚至可以使用cat /proc/self/environ,它会发出这种格式。 :)
【解决方案2】:

您通常可以从 bash 或 shell 脚本加载环境变量,它是一种不同的语言。您将不得不使用 bash 来评估文件,然后以某种方式打印出变量然后读取它们。见Forcing bash to expand variables in a string loaded from a file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2019-01-01
    • 2013-09-16
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多