2012-07-09 30 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スクリプト私は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 

?。

バージョン情報:

のPython 2.6.5 のbash:4.1.5

+0

スクリプトを出し入れする最も簡単な方法は、おそらくstdin/stdoutです。 –

答えて

13

2回目の試行 - 今回のシェルは、統合矛先を取ります。これを含む

考える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の端から統合を駆動する第1の答えです。

パイソンオブジェクトシリアライゼーションのようなものの代わりに

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コードを修正する必要があることを示唆しているコード) - これは理想的ではありません。 –

+0

@HomunculusReticulli OK - 私は今すぐ理解したいと思っています。新しいコードはシェルを使って統合を推進しています。 –

+0

はい! - それは直感的に理にかなっています!どうもありがとう!。ちょうどそれを試して、それが動作します:) –

0

、おそらく一つの方法は、カンマ区切りのリストとコマンドからパイプそれらを印刷することですライン。あなたが何かを行うことができます

その後:また

> python script.py | sh shellscript.sh 
1

を、あなたがSTDINを読み取るためのpythonのプロセスを伝えることができます " - "

echo "print 'test'" | python - 

のように今、あなたはPythonコードのmultiline snippetsを定義することができますサブシェルに渡す

FOO=$(python - <<PYTHON 

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

print ' '.join(foo()) 

PYTHON 
) 

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

envに設定すると、環境変数とローカル変数をbashからpython( ".."文字列)にリストする/渡すことができます。

+0

ありがとう、これは私にとって非常に役立ちました。 – Perlnika

関連する問題