私は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は、シェルスクリプトへの入力として使用している文字列です。何か不足していますか、それとも別の方法がありますか?
問題は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_output
とcheck_call
のShell=
引数には、Popen
と同じルールがあることに注意してください。
実際に引数を送信しています...シェルスクリプトが印刷する代わりにファイルを書き込んだ場合、それが表示されます。スクリプトからの印刷出力を確認するには、通信する必要があります...
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