我尝试了 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
谁能告诉我第三个选项有什么问题?如果是因为我没有使用单独的线程来操作输出,为什么第一个选项适用于 subprocess.popen?我怀疑 pexpect 使用套接字启动进程有问题,但我不确定,特别是考虑到选项 2 效果很好。