[英]Read Bash variables into a Python script
我正在运行一个 bash 脚本(test.sh),它加载到环境变量中(来自 env.sh)。 这很好,但我试图看到 python 可以加载已经在 bash 脚本中的变量。
是的,我知道将我需要的特定变量作为参数传递可能会更容易,但我很好奇是否可以获取 bash 变量。
测试.sh
#!/bin/bash
source env.sh
echo $test1
python pythontest.py
您需要在 bash 中导出变量,否则它们将是 bash 的本地变量:
export test1
然后,在蟒蛇
import os
print os.environ["test1"]
还有另一种使用subprocess
,它不依赖于设置环境。 不过,多一点代码。
对于如下所示的 shell 脚本:
#!/bin/sh
myvar="here is my variable in the shell script"
function print_myvar() {
echo $myvar
}
您可以检索变量的值,甚至可以在 shell 脚本中调用函数,如下面的 Python 代码所示:
import subprocess
def get_var(varname):
CMD = 'echo $(source myscript.sh; echo $%s)' % varname
p = subprocess.Popen(CMD, stdout=subprocess.PIPE, shell=True, executable='/bin/bash')
return p.stdout.readlines()[0].strip()
def call_func(funcname):
CMD = 'echo $(source myscript.sh; echo $(%s))' % funcname
p = subprocess.Popen(CMD, stdout=subprocess.PIPE, shell=True, executable='/bin/bash')
return p.stdout.readlines()[0].strip()
print get_var('myvar')
print call_func('print_myvar')
注意, shell=True
需要设置,以便处理CMD
中的 shell 命令按原样处理,设置executable='bin/bash'
使用进程替换,默认/bin/sh
不支持.
假设设置的环境变量是永久性的,我认为它们不是。 您可以使用os.environ
。
os.environ["something"]
我创建了一个这样做的小库:
如果您尝试获取文件的来源,则缺少的内容是set -a
。 例如,要获取env.sh
,您可以运行:
set -a; source env.sh; set +a.
您需要这样做的原因是 bash 的变量对于 bash 来说是本地的,除非它们被导出。 -a 选项指示 bash 导出所有新变量(直到您使用 +a 将其关闭)。 通过在source
之前使用set -a
,所有由source
导入的变量也将被导出,因此可用于 python。
信用:此命令来自@chepner 作为对此答案的评论发布的评论。
两个附加选项,在您的特定情况下可能会或可能不会有帮助:
选项1:
如果 env.sh 仅包含常规 NAME=value,则让 python 读取它(作为文本文件)。
这仅适用于您控制 env.sh 的格式,并且 env.sh 不包含任何真正的 shell 命令,并且您控制包含的 shell 脚本的情况。
选项 2:
在 shell 脚本中,一旦设置了所有必要的变量,要么将它们保存到文件中,要么将它们作为标准输入通过管道传输到 python 脚本:
#!/bin/bash
source env.sh
echo $test1
set | python pythontest.py
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.