2010-04-28 13 views
6

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?

cevap

4

Alt işlemin 'stdin' ve 'stdout'u, bir işletim sistemi kaynağı olan dosya tanıtıcısını (bir sayıdır) aldığından. Bu, bir nesneyi geçirirseniz, alt işlem modülünün, nesnenin bir 'fileno' özniteliğine sahip olup olmadığını ve varsa, kullanacağını denetler.

'gzip' nesnesi, bir işletim sisteminin sağladığı bir şey değil. Açık bir dosya, bir soket, bir boru. Gzip nesnesi, read() ve write() yöntemlerini sağlayan ancak fileno özniteliği olmayan bir nesnedir.

Alt işlemenin iletişim() yöntemine bakabilirsiniz, ancak kullanmak isteyebilirsiniz.

+0

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. –

+0

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

İlgili konular