Stdin'den okuyan küçük bir komut satırı aracı var. Bir gziped dosyası ile ben de aday olacağını komut satırında ...Açılmış gzip dosyasını Python'da Popen ile kullanabilir miyim?
./foo < bar
ya ...
cat bar | ./foo
ben yapabilirim Python
zcat bar.gz | ./foo
çalıştırabilirsiniz. ..
Popen(["./foo", ], stdin=open('bar'), stdout=PIPE, stderr=PIPE)
ama ben Ben rüzgar
import gzip
Popen(["./foo", ], stdin=gzip.open('bar'), stdout=PIPE, stderr=PIPE)
p0 = Popen(["zcat", "bar"], stdout=PIPE, stderr=PIPE)
Popen(["./foo", ], stdin=p0.stdout, stdout=PIPE, stderr=PIPE)
ben yanlış mı yapıyorum çalıştırmak zorunda yapamaz? Neden gzip.open ('bar') öğesini Popen'e stdin arg olarak kullanamıyorum?
Evet, aslında p = Popen ([...]) kullanıyorum ve p.communicate() [0] okuyorum. Ayrıca, programım foo olarak adlandırılmıyor ve giriş dosyam bar değil ;-) Yani kolay bir düzeltme olmadığını mı söylüyorsunuz? Popen (["./ foo",], stdin = gzip.open ('bar'), stdout = PIPE, stderr = PIPE "(her ne kadar kötü çıkışa geri dönüyor olsa da) çalışıyorsa, garip buluyorum. istisna. Bir fileno özniteliğine sahip olmasa bile onunla bir şeyler yapıyor. –
Alt işlem modülünden gelen 'PIPE' ve 'STDOUT' öznitelikleri 'özel sabitlerdir'; stderr = STDOUT durumunda, sabit, istemci işlemine geçirilmesi gereken dosya adının aynı olması gerektiğini söyler, bu da stdout olarak iletilir. PIPE durumunda, 'pipe()' komutunu kullanarak yeni bir fileno yaratılır, borunun yarısı (aslında 2 sayıdır) müşteri işlemine geçirilir ve size verilir. Bir kısma yazılan her şey, diğerinden okunabilir. Bunu kolay bir şekilde çözemezsiniz, daha fazla programlama gerekli olacaktır. – ondra