2015-10-10 41 views
1

我有3個文件,讓我們一個一個看。如何解決這個bash python交互?

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的文件中解析它,而我喜歡訪問list如在bash數組等等我可以稍後使用它。

  • 目前我正在打印list,但我不能總是那樣做。因爲我的python文件中可能有多個list,我不能打印每個文件並從bash中檢索它。所以,我可以返回一個變量從python到bash莫名其妙,我正在尋找來自另一個bash文件的source a bash文件。

  • 最終,我想在我的python文件中擁有多個函數,並嘗試從bash訪問特定的函數返回值。我可以做到嗎?喜歡寧願撥打一個完整的python文件,我可以從python文件中調用特定的function嗎?

回答

2

您不需要使用sed來分析python腳本的輸出。

在python腳本打印輸出之前,轉換列表爲空格分隔字符串(希望你不要有任何項目列表與它的空間)

print " ".join(lst) 

此輸出可以很容易地通過在外殼環。 對我來說,下面的代碼給出了下面的輸出。

#! /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 
+0

感謝您的回答。真的很有幫助,+1。 –