2012-03-05 15 views
6

私はこれを前に行ったことを誓ったが、今はそれを見つけることができない。混在シェルとPythonスクリプトが可能ですか?

#!/bin/bash 
#shell stuff.. 

set +e 

VAR=aabb 

for i in a b c; do 
    echo $i 
done 

# same file! 

#!/usr/bin/env python 
# python would be given this fd which has been seek'd to this point 

import sys 

print ("xyzzy") 

sys.exit(0) 

答えて

8

あなたはこのシェル構文を使用することができます(ここでは、それが呼び出されはUnixの文献にを文書化):それは可能である、すなわち、シェルスクリプトは、「ミッドストリーム」interpeterのpythonを開始持っている

#!/bin/sh 
echo this is a shell script 

python <<@@ 
print 'hello from Python!' 
@@ 

'< <'演算子の後のマーカーは、任意の識別子で、EOF(ファイルの終わり)やEOD(文書の終わり)のようなものを使用することがよくあります。マーカーが行を開始すると、シェルはプログラムの入力終了としてそれを解釈します。

2

あなたは、PythonとBashのプロセスを交換し、その標準入力でPythonに指定されたプログラムを渡すために

exec python <<END_OF_PYTHON 
#!/usr/bin/env python 

import sys 

print ("xyzzy") 

sys.exit(0) 
END_OF_PYTHON 

を書くことができます。 (execはBashのプロセスを置き換え<<END_OF_PYTHON原因END_OF_PYTHONまでのすべてを含むように、標準入力を。。)

+0

+1:executingは単にpythonを呼び出すよりも優れています。この文脈でシバンは不要で、単にコメントとして扱われます。 –

+0

@WilliamPursell:私はシバンに気付かなかった。 。 。それは不必要であるだけでなく、実際には誤解を招きます。これは 'env'を呼び出さないからです。私はコマンドが 'exec env python << END_OF_PYTHON'であるかもしれないと思いますが、シバンを削除するほうが良いでしょう。 – ruakh

0

をもちろん、私はこれを投稿した直後、私はそれを行う方法を思い出した:

#!/bin/sh 

echo Shell 

python <<EOF 

import sys 

print "Python" 

sys.exit(0) 

EOF 
2

あなたpython場合スクリプトは非常に短いです。スクリプトでもしていないだけ - 私はマッシュアップ/混合は非常に強力な技術であることができることを同意

python -c 'import sys; print "xyzzy"; sys.exit(0)' 

それとも

python -c ' 
import sys 
print("xyzzy") 
sys.exit(0) 
' 
0

:あなたは-cオプションを使用してpythonにそれを文字列として渡すことができますコマンドライン(例えばperlインラインライナーは時間の経過とともに非常に成功していることが証明されています)。だから、bashの/ Pythonで混合スクリプティングについて(KEV​​によって言及に加えて)ワンライナーの別の変形の私の小さなヒント:

for VAR in $(echo 'import sys; print "x y z"; sys.exit(0)' | python -);do echo "$VAR"; done; 

が生成する短いインラインスクリプトに最適です

x 
y 
z 
0

/コード。大規模で優れたアプリケーションを書くのに適切な接着剤としてbashスクリプトに頼ることができれば、チームメンバはそれぞれ異なる言語でコード/スクリプトを書くことができ、次のように作業をまとめることができます。もちろん、非常に多くの異なるランタイムが1つのアプリケーションで大丈夫だと想定する必要があります。 @ user318904 @phs @piokuc

関連する問題