pexpect と subprocess.Popen の両方を python から試して、外部の長期バックグラウンド プロセス (このプロセスはソケットを使用して外部アプリケーションと通信します) を呼び出しました。詳細は次のとおりです。
subprocess.Popen(launchcmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) これは正常に動作します。他に何もする必要はありません。ただし、すぐに出力を取得する必要があるため、パイプ ファイル バッファーの問題を回避するために pexpect を選択します。
obj= pexpect.spawn(launchcmd, timeout=None) 外部プロセスを起動した後、別のスレッドを使用して「readline」を実行し、起動されたプロセス「obj」の出力を読み取り、すべて問題ありません。
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 がうまく機能することを考えると、確信が持てません。