1

pexpect と subprocess.Popen の両方を python から試して、外部の長期バックグラウンド プロセス (このプロセスはソケットを使用して外部アプリケーションと通信します) を呼び出しました。詳細は次のとおりです。

  1. subprocess.Popen(launchcmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) これは正常に動作します。他に何もする必要はありません。ただし、すぐに出力を取得する必要があるため、パイプ ファイル バッファーの問題を回避するために pexpect を選択します。

  2. obj= pexpect.spawn(launchcmd, timeout=None) 外部プロセスを起動した後、別のスレッドを使用して「readline」を実行し、起動されたプロセス「obj」の出力を読み取り、すべて問題ありません。

  3. obj= pexpect.spawn(launchcmd, timeout=None) 外部プロセスを起動した後、それ以上何もしませんでした。つまり、そのままにしておきました。ただし、「ps -e」コマンドを使用すると、起動されたプロセスを見つけることができますが、起動されたプロセスはブロックされているようで、ソケットで他のアプリケーションと通信できません。

わかった。より具体的には、質問を定式化するためのサンプルコードをいくつか入れました。

import subprocess
import pexpect
import os

t=1
while(True):
    if(t==1):
        background_process="./XXX.out"
        launchcmd = [background_process]
        #---option 3--------
        p=pexpect.spawn(launchcmd, timeout=None) # process launced, problem with socket.
        #---option 1--------
        p=subprocess.Popen(launchcmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # process launced, everything fine
        t=0 

3番目のオプションの何が問題なのか誰か教えてもらえますか? また、別のスレッドを使用して出力を操作しなかったことが原因である場合、最初のオプションが subprocess.popen で機能するのはなぜですか? ソケットを使用してプロセスを起動する pexpect に問題があると思われますが、特にオプション 2 がうまく機能することを考えると、確信が持てません。

4

1 に答える 1

1

あなたはこれを複雑にしすぎていると思います。

はい、ほとんどのアプリケーションは tty/pty デバイスを認識し、バッファなし (または少なくともラインバッファ) の出力を使用するように切り替えるため、 a のpty代わりに aを使用してバックグラウンド プロセスと通信することをお勧めします。pipe

しかし、なぜ pexpect なのですか? Python の pty モジュールを使用するだけです。最初に呼び出しopenptyていくつかのファイルハンドルを取得し、次に使用Popenしてプロセスを生成します。コード例は次の質問にあります (緑色のチェックマークが付いた回答) Python Run a daemon subprocess & read stdout

于 2011-07-07T06:15:10.927 に答える