将shell / bash脚本中的变量读入python

时间:2015-12-13 19:28:03

标签: python bash shell variables archlinux

我需要在Python中运行一些Shell / Bash脚本(例如,使用子进程或系统)并获取这些脚本中的一些变量的值。我知道变量的名称,因为它们在每个变量中都是相同的,但值不同。

我无法使用正则表达式来提取变量内容,因为有时这些脚本会带有处理,比如if语句会根据计算机规范更改这些变量的内容(例如,Linux内核的版本,架构......)

但是我会下载这些脚本,所以我不能简单地将变量添加到env或者回显脚本中的变量内容,我需要从Python中获取脚本变量。

真正理想的是避免将脚本保存到磁盘,因为它会运行几次并且从磁盘写入/读取可能是个问题。我使用urllib从网址获取脚本。

1 个答案:

答案 0 :(得分:2)

This answer似乎或多或少地涵盖了您正在寻找的内容。为什么不下载脚本,来源它(虽然,在该场景中运行未知代码的常用警告适用)和regex变量的“set”输出,只要你知道它们的名字?

#### testSource.sh file
foo="abcdef"
bar="uvwxyz"
if [[ -z $bar ]]; then
    var3="test"
else
    var3="testing"
fi

编辑:以下示例应该不需要将脚本下载到磁盘。这个版本实际上下载了上面的'testSource'文件并将其直接写入Bash子流程的标准输入 - 你应该能够将你想要下载的链接放入'urls'数组并初始化'值'带有与所需变量名对应的键的字典:

import subprocess
import re
import requests

urls = ['http://192.168.1.10/testSource.sh']

for url in urls:
    response = requests.get(url).content
    values = dict.fromkeys(['foo', 'bar', 'var3'])
    proc = subprocess.Popen(['bash', '0<'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
    proc.stdin.write(response)
    proc.stdin.flush()
    output, err = proc.communicate(input='set')
    for key in values:
        match = re.search('%s=(.*)$' % key, output, re.MULTILINE)
        if match: 
            values[key] = match.group(1)
            print('%s=%s' % (key,values[key]))