Logar stdin e stdout do programa

2

O que eu quero, porém, é rodar um programa e logar tanto o stdin como o stdout, mas eu quero que o stdin seja fornecido a partir de um arquivo.

Eu achei que script log.txt < input.txt funcionaria, mas isso não acontece, porque o stdin não é logado, somente a saída é registrada.

Onde input.txt é

./program
something for the stdin of program
some more stuff
    
por Buge 17.04.2015 / 09:47

3 respostas

0

Eu acabei hackeando essa coisa juntos:

import subprocess
import time
import sys

log = open(sys.argv[3], 'w')

input = open(sys.argv[2], 'r')

p = subprocess.Popen([sys.argv[1]], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

def readAllSoFar(proc, retVal=''):
  while (subprocess.select.select([proc.stdout],[],[],0)[0]!=[]):
    retVal+=proc.stdout.read(1)
  return retVal

while True:
    print('starting loop')
    line = input.readline()
    print('read line ' + line)
    if not line:
        print('breaking')
        break

    print('before sleep1')
    time.sleep(0.1)
    print('before readAllSoFar')
    output = readAllSoFar(p)
    print('got output' + output)
    log.write(output)
    time.sleep(0.1)
    log.write(line)
    p.stdin.write(line)

Execute com python runner.py ./program_to_run input.txt output.txt

Assume-se que qualquer resultado de um comando será feito em um décimo de segundo.

    
por 01.09.2015 / 02:04
0

Você já tem o log stdin: esse é o seu arquivo.

Caso contrário (não tenho certeza se é isso que você está tentando realizar), se você preferir um log contendo stdin e stdout intercalados, você pode modificar seu programa para enviar as linhas de stdin para stdout, pois elas são ler, antes de serem processados.

    
por 17.04.2015 / 09:55
0

Esta provavelmente não é a solução mais bonita, mas você pode fazer algo como:

cat file.txt | tee -a stdin.txt | ./program | tee -a stdout.txt

Você poderia usar o mesmo arquivo em ambos os tees, mas sua entrada e saída podem ficar confusas e ilegíveis.

    
por 17.04.2015 / 12:17