Я попробовал и pexpect, и subprocess.Popen из python для вызова внешнего долгосрочного фонового процесса (этот процесс использует сокет для связи с внешними приложениями) со следующими подробностями.
подпроцесс.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 =Нет) после запуска внешнего процесса я больше ничего не делал, т.е. просто оставил его там.Хотя с помощью команды "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
Может кто-нибудь сказать мне, что не так с третьим вариантом?И если это связано с тем, что я не использовал отдельный поток для управления выводом, почему 1-й вариант работает с subprocess.popen?Я подозреваю, что что-то не так с pexpect для запуска процесса с использованием сокета, но я не уверен, особенно учитывая, что вариант 2 работает хорошо.