質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4669閲覧

subprocessの標準出力を非同期で取得したい

Reem

総合スコア27

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/02/21 15:45

前提・実現したいこと

初歩的な質問かもしれませんが、調べても自己解決出来なかったため質問させていただきます。

Pythonから別のプログラムを起動してログ(標準出力)を取得するため、下記のようなプログラムを用意したのですがいくつか分からない点があります。

python

1command = ['./program'] 2P_PATH = '/home/user/デスクトップ/NewFolder' 3 4prco = subprocess.Popen(command, cwd=P_PATH, stdout = subprocess.PIPE, stderr = subprocess.STDOUT) 5 6for line in prco.stdout.readline: 7 print(line.rstrip().decode("utf8")) 8 9print("finish")
  • 変数prcoにメモリアドレスらしきものが代入されていたのですが、subprocessで起動したプロセスのメモリアドレスでしょうか?

  • prco.stdout.readlineforで回すとログが一行ずつ出力されるのですが、内部はどのようになっているのですか?(なにかしらをイテレータで処理していると思うのですが...)

  • subprocessで起動したプロセスが終了しないとforループから抜け出せないのですが、非同期でログを出力することはできますか?(asyncなどで別の処理と並行して出力したいです)

asynce forを使えば実現出来そうな気もするのですが、仕様がよく分からず困っています。

Python、Linux系OS初心者なので細かいところまで解説していただけると幸いです。
※理解しきれていない事が多いので不明な点を指摘して頂けると修正致します。

環境

Python 3.6.9
Ubuntu 18.04.4 LTS

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

変数prcoにメモリアドレスらしきものが代入されていたのですが、subprocessで起動したプロセスのメモリアドレスでしょうか?

違います。生成されたsubprocess.Popen objectのアドレスで、親のPythonプロセスの仮想アドレス空間上のどこかにこのオブジェクトはいます。

prco.stdout.readlineをforで回すとログが一行ずつ出力されるのですが、内部はどのようになっているのですか?(なにかしらをイテレータで処理していると思うのですが...)

まずそのコードは動かないはずです。

python

1for line in prco.stdout.readline():

または

python

1for line in prco.stdout.readlines():

の間違いでは?

基本的に入出力などはioモジュールにまとめられているような方法で抽象化されていて、readlinereadlinesの挙動についてはこちらが参考になります。

subprocessで起動したプロセスが終了しないとforループから抜け出せないのですが、非同期でログを出力することはできますか?(asyncなどで別の処理と並行して出力したいです)

readlinesの方だとプロセスが終わってから(厳密にはEOFが送信されてから、かな)値が返るので無理ですね。バッファをそのままイテレートするかreadlineを繰り返し呼び出すのであれば、プロセスの終わりは待たないかと。

投稿2020/02/21 19:48

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Reem

2020/02/22 00:42

ご回答ありがとうございます。 prco.stdout.readline():の間違いですね… 書き込むときに()が消えてしまっていたみたいです。 わかりやすい回答でとても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問