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 

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

4

1 回答 1

1

我认为你把这件事弄得太复杂了。

是的,使用 apty而不是 apipe与后台进程通信是个好主意,因为大多数应用程序可以识别 tty/pty 设备并切换到使用无缓冲输出(或至少是行缓冲)。

但为什么要期待?只需使用 Python 的 pty 模块。首先调用openpty以获取一些文件句柄,然后用于Popen生成进程。示例代码在以下问题中找到(带有绿色复选标记的答案) Python Run a daemon sub-process & read stdout

于 2011-07-07T06:15:10.927 回答