Процесс регистрации 'STDIN и STDOUT - PullRequest
1 голос
/ 15 февраля 2012

Я хотел бы запустить процесс с subprocess.Popen() и общаться с ним через оболочку python, как при обычном поведении subprocess.Popen.Кроме того, я хотел бы дискурсивно записывать STDIN и STDOUT в файл журнала.

Как я могу это сделать?

1 Ответ

1 голос
/ 15 февраля 2012

Если предположить, что дискурсивно означает бессвязное, а бессвязное означает все в одном файле, то следующий фрагмент - то, что вы просили.

Дискурсивная регистрация с различением источника и взаимодействия

Переопределите свой метод связи, как аналогичный вопрос здесь

import subprocess

def logcommunicate(self, s):
    self.logfilehandle.write("Input "+s)
    std = self.oldcommunicate(s)

    self.logfilehandle.write("Output "+std[0])
    return std

subprocess.Popen.oldcommunicate = subprocess.Popen.communicate
subprocess.Popen.communicate = logcommunicate
logfh = open("/tmp/communicate.log", "a")

proc = subprocess.Popen(['cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
proc.logfilehandle = logfh

result = proc.communicate("hello there\n")
print result 

Дискурсивная регистрация с различением источника

Сначала используйте StringIO вместо файлов, затем подкласс StringIO, чтобы переопределить его метод записи, чтобы открыть, который добавляет метку времени и источник. Затем напишите пользовательскую функцию сравнения, которая сортирует на основе метки времени и источника, сначала метку времени, а затем источник ввода и затем вывод

 with open("file.log","wb") as in logfile:
 out = MyOutPutStringIO.StringIO() 
 in = MyInputStringIO.StringIO()
 subprocess.Popen(cmd, shell=True, universal_newlines = True, stdin=in, stdout=out)

 #Then after you are done
 linestotal = []
 for line in in.readlines():
     linestotal.append(line)
 for line in out.readlines():
     linestotal.append(line)

 linestotal.sort(customsortbasedontimestampandinput)

 for line in linestotal.readlines():
    logwrite.write(line)

Дискурсивное ведение журнала

 with open("file.log","wb") as in logfile:
 subprocess.Popen(cmd, shell=True, universal_newlines = True, stdin=logfile, stdout=logfile)

Обратное показано ниже

Курсовая регистрация

 with open("stdout.txt","wb") as out:
 with open("stderr.txt","wb") as err:
 with open("stdin.txt","wb") as in:
 subprocess.Popen(cmd, shell=True, universal_newlines = True, stdin=in,stdout=out,stderr=err)
...