如何解决这个bash python交互?

时间:2015-10-10 09:29:37

标签: python bash

我有3个文件,让我们逐个查看。

params.conf

[a]
[b]
[c]
[d]
[e]

parsing.py

from ConfigParser import SafeConfigParser

parser = SafeConfigParser()
parser.read('params.conf')

lst=parser.sections()
print lst

demo.sh

#! /bin/bash
value=$(python parsing.py)
echo "$value"

运行demo.sh后,我应该得到输出['a','b','c','d','e'],我就是这样了。

但是,当我进入下一个级别时,有几个问题。

  • 我想使用列表元素,所以此时我需要使用sed在我不想要的bash文件中解析它,而我喜欢访问{{1}作为bash中的数组,以便我以后可以使用它。

  • 目前我正在打印list,但我不能总是那样做。因为我的python文件中可能有多个list,而我只是无法打印它们并从bash中检索它。所以,我可以以某种方式将变量从python返回到bash,我正在搜索来自另一个list文件的source bash文件。

  • 最终我希望在bash文件中有多个函数,并尝试从bash访问特定函数的返回值。我能做到吗?就像调用整个python文件一样,我可以从python文件中调用特定的function吗?

1 个答案:

答案 0 :(得分:2)

您不需要使用sed来解析python脚本的输出。

在打印输出之前的python脚本中,将列表转换为空格分隔的字符串(希望列表中没有任何带有空格的项目)

print " ".join(lst)

此输出可以在shell中轻松循环。 对我来说,下面的代码给出了以下输出。

#! /bin/bash
lst=$(python parsing.py)
for i in $lst
do
    echo $i
done

params.conf与你的相同......

<强>输出

a
b
c
d
e

希望这有助于解决您的一些问题..

也可以通过以下方式在shell脚本中调用python中的特定函数...

具有多个功能的python文件

import sys

def foo():
    print 'i am foo'

def func():
    print 'i am func'

def bye():
    print 'i am bye'

if __name__ == "__main__":
    if len(sys.argv)==2:
        x = getattr(sys.modules[__name__], sys.argv[1])
        x()

和shell脚本(我使用命令行参数来命名python函数是什么)

#! /bin/bash
echo $(python params.py $1)

...输出

# ./demo.sh foo
i am foo
# ./demo.sh func
i am func
# ./demo.sh bye
i am bye