2012-07-09 125 views
5

我寫了一個Python模塊,其中包含返回數組的函數。我希望能夠訪問從python模塊返回的字符串數組,並在bash腳本中進行迭代,以便遍歷數組元素。將python數組傳遞給bash腳本(並將bash變量傳遞給python函數)

例如:

Python模塊(mymod)

def foo(): 
    return ('String', 'Tuple', 'From', 'Python') 

def foo1(numargs): 
    return [x for x in range(numargs)] 

bash腳本

foo_array = .... # obtain array from mymod.foo() 
for i in "${foo_array[@]}" 
do 
    echo $i 
done 


foo1_array = .... # obtain array from mymod.foo1(pass arg count from bash) 
for j in "${foo1_array[@]}" 
do 
    echo $j 
done 

我怎麼能在bash實現這個?

版本信息:

的Python 2.6.5 慶典:4.1.5

+0

讓腳本進出腳本的最簡單方法可能是通過stdin/stdout。 – 2012-07-09 09:11:39

回答

13

第二個嘗試 - 這一次殼採用整合首當其衝。

鑑於foo.py包含此:

def foo(): 
     foo = ('String', 'Tuple', 'From', 'Python') 
     return foo 

然後寫出如下您的bash腳本:

#!/bin/bash 
FOO=`python -c 'from foo import *; print " ".join(foo())'` 
for x in $FOO: 
do 
     echo "This is foo.sh: $x" 
done 

的其餘部分是從Python端驅動整合的第一個答案。

的Python

import os 
import subprocess 

foo = ('String', 'Tuple', 'From', 'Python') 

os.putenv('FOO', ' '.join(foo)) 

subprocess.call('./foo.sh') 

慶典

#!/bin/bash 
for x in $FOO 
do 
     echo "This is foo.sh: $x" 
done 
+0

感謝您的反饋。我希望我的Python模塊不知道是誰/叫什麼(關注點分離) - 您建議的代碼需要修改python代碼 - 這並不理想。 – 2012-07-09 09:26:13

+0

@HomunculusReticulli好的 - 希望我現在明白了 - 新代碼使用shell來驅動集成。 – 2012-07-09 09:33:10

+0

是的! - 這直觀上有道理!非常感謝!。剛剛嘗試過它,它的工作原理:) – 2012-07-09 10:14:08

0

代替的類似對象序列化,或許是一個辦法是從命令打印逗號分隔值和管它們的列表線。

然後,你可以這樣做:

> python script.py | sh shellscript.sh 
1

此外,你可以告訴Python進程能夠讀取標準輸入「 - 」作爲

echo "print 'test'" | python - 

現在,您可以定義的Python代碼multiline snippets並將它們傳遞到subshel​​l中

FOO=$(python - <<PYTHON 

def foo(): 
    return ('String', 'Tuple', 'From', 'Python') 

print ' '.join(foo()) 

PYTHON 
) 

for x in $FOO 
do 
    echo "$x" 
done 

您還可以使用環境設置列出/傳遞環境和本地變量從bash到python(到「..」字符串)。

+0

謝謝,這對我非常有幫助。 – Perlnika 2014-03-05 18:37:09