2013-04-16 47 views
2

有什麼辦法可以調用shell腳本並使用python腳本中定義的函數/變量?如何從python調用shell腳本函數/變量?

劇本是unix_shell.sh

#!/bin/bash 
function foo 
{ 
... 
} 

是否可以調用從蟒蛇這個函數foo?

解決方案:

  1. 對於函數:轉換殼牌功能Python函數
  2. 對於外殼局部變量(非出口),運行殼這個命令,就在打電話的python腳本:
    出口$(集| TR '\ n''「)

  3. 對於外殼全局變量(從外殼出口),在Python中,您可以: 進口OS 打印os.environ [ 「VAR1」]

+0

看看'subprocess'模塊。它可能有幫助。 –

回答

1

不,這是不可能的。你可以用執行一個shell腳本,在命令行上傳遞參數,它可以打印數據,你可以從Python中解析出來。

但那不是真的調用的功能。這仍然執行帶有選項的bash,並在stdio上獲取一個字符串。

這可能會做你想做的。但這可能不是正確的做法。 Bash不能做很多Python不能做的事情。改爲在Python中實現該功能。

2

是,以類似的方式,你會怎麼稱呼它從另一個bash腳本:

import subprocess 
subprocess.check_output(['bash', '-c', 'source unix_shell.sh && foo']) 
+0

這並不是真的在調用這個函數。那執行bash。 –

+0

@LennartRegebro:我沒有看到你怎麼能期望執行一個bash函數而不執行某些級別的bash ... – Eric

+0

這只是意味着這個問題並沒有多大意義。使用命令行參數啓動子進程並不真正稱爲調用函數,即使該函數被執行。即使你認爲它合格,它也不太可能是最好的解決方案。 –

0

我不知道很多關於蟒蛇,但如果你的shell腳本函數定義後使用export -f foo,然後如果你開始一個子bash,可以調用該函數。如果沒有export,你需要在以python開頭的子bash中運行shell腳本. script.sh,但它會運行所有的東西並定義所有的函數和所有變量。

0

您可以將每個函數分隔到自己的bash文件中。然後使用Python將正確的參數傳遞給每個獨立的bash文件。

這可能比僅僅用Python自己重寫bash函數更容易。

然後,您可以使用

import subprocess 
subprocess.call(['bash', 'function1.sh']) 
subprocess.call(['bash', 'function2.sh']) 
# etc. etc. 

您可以使用子進程來傳遞參數太多調用這些函數。