我正在运行一个bash脚本(test.sh),它加载到环境变量中(来自env.sh)。这工作正常,但我试图看到python可以加载已经在bash脚本中的变量。
是的我知道将所需的特定变量作为参数传递可能更容易,但我很好奇是否有可能获得bash变量。
test.sh
#!/bin/bash
source env.sh
echo $test1
python pythontest.py
env.sh
#!/bin/bash
test1="hello"
pythontest.py
?
print test1 (that is what I want)
答案 0 :(得分:43)
您需要在bash中导出变量,或者它们将是bash的本地变量:
export test1
然后,在python中
import os
print os.environ["test1"]
答案 1 :(得分:4)
假设设置的环境变量是永久性的,我认为它们不是。您可以使用os.environ
。
os.environ["something"]
答案 2 :(得分:4)
我创建了一个可以执行此操作的小型库:
答案 3 :(得分:4)
使用#!/bin/sh
myvar="here is my variable in the shell script"
function print_myvar() {
echo $myvar
}
的另一种方式不依赖于设置环境。但是需要更多代码。
对于如下所示的shell脚本:
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脚本中调用函数,如下面的Python代码所示:
shell=True
请注意,必须设置CMD
以便处理executable='bin/bash'
中的shell命令以按原样处理,并设置/bin/sh
以使用进程替换,这是不受支持的默认为$(document).ready(function () {
$('.group').hide();
$('#option1').show();
$('#outer').change(function () {
$('.group').hide();
$('#'+$(this).val()).show();
})
});
。
答案 4 :(得分:0)
如果您正在尝试获取文件的来源,那么您缺少的是 set -a
。例如,要获取 env.sh
,您可以运行:
set -a; source env.sh; set +a.
您需要这样做的原因是 bash 的变量对于 bash 来说是本地的,除非它们被导出。 -a 选项指示 bash 导出所有新变量(直到您使用 +a 将其关闭)。通过在set -a
之前使用source
,所有由source
导入的变量也将被导出,从而对python可用。
信用:此命令来自@chepner 作为对 this answer 的评论发布的评论。