Python comment diriger un sous-processus vers un fichier de sortie

J’ai créé un script qui reçoit un tas de fichiers journaux en entrée afin de faire des correspondances. Cependant, ma méthode “processFiles” ne fonctionne pas correctement. Il devrait écrire toutes les données dans “fileDest”. Mais le fichier créé rest vide. Si je mets une instruction “print processFiles” sous la fonction elle-même, je peux voir les lignes comme un débit sur mon terminal.

Pour rendre les choses plus intéressantes, bunzip2 rapporte cette erreur pendant que je lance le script:


En cours /opt/syslog/app/applog-20140314.bz2. bunzip2: Impossible d’ouvrir le fichier d’entrée>: aucun fichier ou répertoire de ce type. bunzip2: le fichier compressé se termine de manière inattendue; c’est peut-être corrompu? * La raison possible suit. bunzip2: Pas de fichier ou de répertoire de ce type


Il semble que quelque chose dans mon code envoie la sortie à stdout. Et pas au fichier.

def parse_log_files(self): sub_dir = os.listdir(self.base_path) for directory in sub_dir: if re.search('app\d+', directory): fileInput = self.base_path + '/' + directory + '/applog-' + str(self.date.strftime('%Y%m%d')) + '.bz2' fileDest = '/var/tmp/parsed_log_files-' + str(self.date.strftime('%Y%m%d')) + '.decompressed' if not os.path.isfile(fileDest): subprocess.Popen(['touch',fileDest]).communicate()[0] proccessFiles = subprocess.Popen(['/bin/bunzip2','-cd',fileInput,' > ',fileDest],stdout=subprocess.PIPE).communicate()[0] accessFileHandle = open(self.file_out, 'r') readFileHandle = accessFileHandle.readlines() print "Proccessing %s." % fileInput 

' > ' est une syntaxe de redirection de shell. Popen ne fait pas Popen la coquille à moins que vous ne le demandiez (vous ne devriez pas). Si vous souhaitez redirect la sortie d’un sous-processus vers un fichier, utilisez le paramètre stdout=file_object , par exemple:

 from subprocess import check_call with open('/path/to/output', 'wb', 0) as output_file: check_call(['command', 'arg1', 'arg2'], stdout=output_file)