次のようなコマンドラインから実行するプログラムがあります。
$ program a.txt b.txt
プログラムには、引数として2つのテキストファイルが必要です。上記のプログラムを実行するためにPython 3.2スクリプトを作成しようとしています。これを行うにはどうすればよいですか?現在、次のようにsubprocess
モジュールを使用しようとしています。
import subprocess
with open("a.txt", mode="r") as file_1:
with open("b.txt", mode="r") as file_2:
cmd = ['/Users/me/src/program', file_1, file_2]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in process.stdout:
print(line)
私は この投稿 と投稿 ここ を読みました。これらは私の問題に対する同様の解決策を説明しているようです。残念ながら、これらの投稿を読んだ後でも、Pythonコードでプログラムを実行させることができないようです。
誰か助けてもらえますか?前もって感謝します!
_subprocess.Popen
_は文字列の配列を想定しています。その配列の2つの項目はファイルハンドルです。実際のファイルnameを実行しようとしているプログラムに渡す必要があります。
_cmd = ['/Users/me/src/program', 'a.txt', 'b.txt']
_
with open(...) as ...
行を完全に取り除くことができます。
@ Chrisの回答 を見てください。
サブプロセスはコマンドの終了を待たないため、wait
メソッドを使用する必要があります。
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
process.wait()
for line in process.stdout:
print(line)
要件によっては、os.system(cmdline)
が単純なソリューションになる場合があります。
subprocess.wait()
を_stdout=subprocess.PIPE
_と一緒に使用することはお勧めしません。
_with subprocess.Popen(cmd, stdout=subprocess.PIPE) as proc:
print(proc.stdout.read())
_
subprocess.wait()
を呼び出す必要はありません。これにより、proc
のリアルタイム標準出力が出力され、親プロセスはproc
の終了を待機します。
詳細については、これらのURLを確認してください。
https://docs.python.org/3.5/library/subprocess.html#popen-objectshttps://docs.python.org/3.5/library/subprocess.html# popen-constructor