web-dev-qa-db-ja.com

Python:引数(変数)を使用してシェルスクリプトを実行するが、引数がシェルスクリプトで読み取られない

私はPythonからシェルスクリプト(コマンドではない)を実行しようとしています:

main.py
-------
from subprocess import Popen

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],Shell=True)

execute.sh
----------

echo $1 //does not print anything
echo $2 //does not print anything

var1とvar2は、シェルスクリプトへの入力として使用している文字列です。何か不足していますか、それとも別の方法がありますか?

参照: サブプロセスpopen Pythonの使用方法

15
creativeDrive

問題はShell=Trueにあります。次のように、その引数を削除するか、すべての引数を文字列として渡します。

Process=Popen('./childdir/execute.sh %s %s' % (str(var1),str(var2),), Shell=True)

シェルは、引数自体の解釈を行うため、Popenの最初の引数で指定した引数のみをプロセスに渡します。同様の質問の回答を見る こちら 実際に何が起こるかは、シェルスクリプトが引数を取得しないため、$ 1と$ 2が空になることです。

Popenはpythonスクリプトからstdoutとstderrを継承するため、通常、stdin=およびstderr=引数をPopenに提供する必要はありません(出力でスクリプトを実行する場合を除く) >などのリダイレクト。pythonスクリプト内の出力を読み取り、何らかの方法で操作する必要がある場合にのみ、これを行う必要があります。

出力を取得することだけが必要な場合(同期して実行することを気にしないでください)、Popenよりも出力を取得する方が簡単なので、check_outputを試すことをお勧めします。

output = subprocess.check_output(['./childdir/execute.sh',str(var1),str(var2)])
print(output)

check_outputcheck_callShell=引数には、Popenと同じルールがあることに注意してください。

17
micromoses

実際に引数を送信しています...シェルスクリプトが印刷する代わりにファイルを書き込んだ場合、それが表示されます。スクリプトからの印刷出力を確認するには、通信する必要があります...

from subprocess import Popen,PIPE

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],Shell=True,stdin=PIPE,stderr=PIPE)
print Process.communicate() #now you should see your output
3
Joran Beasley