60

我正在运行一个 bash 脚本(test.sh),它加载到环境变量中(来自 env.sh)。这很好,但我试图看到 python 可以加载已经在 bash 脚本中的变量。

是的,我知道将我需要的特定变量作为参数传递可能会更容易,但我很好奇是否可以获取 bash 变量。

测试.sh

#!/bin/bash
source env.sh

echo $test1

python pythontest.py

环境文件

#!/bin/bash

test1="hello"

pythontest.py

?
print test1 (that is what I want)
4

5 回答 5

77

您需要在 bash 中导出变量,否则它们将是 bash 的本地变量:

export test1

然后,在python中

import os
print os.environ["test1"]
于 2013-07-02T20:18:32.610 回答
7

还有另一种使用方法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

于 2017-11-30T03:13:24.663 回答
4

假设设置的环境变量是永久性的,我认为它们不是。您可以使用os.environ.

os.environ["something"]
于 2013-07-02T20:19:40.660 回答
1

如果您尝试获取文件,那么您缺少的是set -a. 例如,对于 source env.sh,您将运行:

set -a; source env.sh; set +a.

你需要这个的原因是 bash 的变量对于 bash 来说是本地的,除非它们被导出。-a 选项指示 bash 导出所有新变量(直到您使用 +a 将其关闭)。通过使用set -abefore source,所有导入的变量source也将被导出,从而可用于 python。

信用:此命令来自@chepner 作为对此答案的评论发表的评论。

于 2021-03-17T20:34:09.707 回答
0

两个附加选项,在您的特定情况下可能会或可能不会有帮助:

选项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

或者

#!/bin/bash
source env.sh

echo $test1

set > /tmp/$$_env
python pythontest.py --environment=/tmp/$$_env

然后,您可以读取文件(或标准输入),并将其解析为例如字典。

于 2022-01-25T23:22:44.580 回答