Dieser Python-Code leitet die Daten problemlos durch das Perl-Skript.
import subprocess
kw = {}
kw['executable'] = None
kw['shell'] = True
kw['stdin'] = None
kw['stdout'] = subprocess.PIPE
kw['stderr'] = subprocess.PIPE
args = ' '.join(['/usr/bin/perl','-w','/path/script.perl','<','/path/mydata'])
subproc = subprocess.Popen(args,**kw)
for line in iter(subproc.stdout.readline, ''):
print line.rstrip().decode('UTF-8')
Dazu muss ich jedoch zunächst meine Puffer in einer Datei auf der Festplatte speichern (/path/mydata). Sauberer ist es, die Daten in Python-Code in einer Schleife durchzugehen und Zeile für Zeile an den Unterprozess zu übergeben, etwa so:
import subprocess
kw = {}
kw['executable'] = '/usr/bin/perl'
kw['shell'] = False
kw['stderr'] = subprocess.PIPE
kw['stdin'] = subprocess.PIPE
kw['stdout'] = subprocess.PIPE
args = ['-w','/path/script.perl',]
subproc = subprocess.Popen(args,**kw)
f = codecs.open('/path/mydata','r','UTF-8')
for line in f:
subproc.stdin.write('%s\n'%(line.strip().encode('UTF-8')))
print line.strip() ### code hangs after printing this ###
for line in iter(subproc.stdout.readline, ''):
print line.rstrip().decode('UTF-8')
subproc.terminate()
f.close()
Der Code bleibt mit der Lesezeile nach dem Senden der ersten Zeile an den Unterprozess hängen. Ich habe andere ausführbare Dateien, die genau den gleichen Code perfekt verwenden.
Meine Datendateien können recht groß sein (1,5 GB). Gibt es eine Möglichkeit, die Daten ohne Speichern in eine Datei zu leiten? Ich möchte das Perl-Skript nicht neu schreiben, damit es mit anderen Systemen kompatibel ist.