web-dev-qa-db-ja.com

pythonを使用して別のプログラムを実行しますか?

次のようなコマンドラインから実行するプログラムがあります。

$ 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コードでプログラムを実行させることができないようです。

誰か助けてもらえますか?前もって感謝します!

11
drbunsen

_subprocess.Popen_は文字列の配列を想定しています。その配列の2つの項目はファイルハンドルです。実際のファイルnameを実行しようとしているプログラムに渡す必要があります。

_cmd = ['/Users/me/src/program', 'a.txt', 'b.txt']
_

with open(...) as ...行を完全に取り除くことができます。

19
Chris Eberle

@ Chrisの回答 を見てください。

サブプロセスはコマンドの終了を待たないため、waitメソッドを使用する必要があります。

    process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    process.wait()
    for line in process.stdout:
        print(line)
21
utdemir

要件によっては、os.system(cmdline)が単純なソリューションになる場合があります。

9
Achim

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

1
Kit sune