2012-02-14 3 views
1

Je voudrais exécuter un processus avec subprocess.Popen() et communiquer avec lui via le shell python, comme le comportement habituel subprocess.Popen. A côté de cela, je voudrais enregistrer de manière discursive les fichiers STDIN et STDOUT dans un fichier journal.Processus de journalisation 'STDIN et STDOUT

Comment puis-je le faire?

+0

Que voulez-vous dire par discursivement? Voulez-vous dire qu'ils se connectent tous les deux au même fichier? – Appleman1234

+0

oui, mais pas seulement ajouter le STDOUT après le STDIN. J'en ai besoin de manière discursive pour pouvoir dire quelle entrée a apporté une sortie. – iTayb

Répondre

1

En supposant que discursivement signifie déconnecter et divaguer signifie tous dans le même fichier, l'extrait suivant est ce que vous avez demandé.

exploitation forestière discursive à la discrimination de la source et l'interaction

passer outre sa communication méthode comme question similaire here

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 

exploitation forestière discursive à la discrimination de la source

Première utilisation StringIO au lieu de fichiers, alors sous-classe StringIO pour remplacer sa méthode d'écriture à open qui ajoute l'horodatage et la source. Ensuite, écrire une fonction de comparaison personnalisée qui trie basée sur l'horodatage et la source, l'horodatage d'abord et ensuite l'entrée de la source puis sortie

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) 

diagraphie Discursive

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

Le contraire est indiqué ci-dessous

Journalisation Cursive

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) 
+0

Peut-être que je n'étais pas assez clair - je voudrais communiquer avec le processus à travers le shell python, comme le sous-processus.Popen comportement habituel. À côté de cela, je voudrais enregistrer le STDIN et STDOUT dans un fichier journal. – iTayb

+0

L'entrée provient d'un fichier dans votre exemple ... Je veux contrôler le processus avec l'interface d'entrée standard. Je veux aussi que la sortie apparaisse sur le shell python. La seule différence est que je veux enregistrer tout ce trafic d'entrée/sortie. – iTayb

Questions connexes