2009-10-19 17 views

cevap

7

Sana bu bağlamda tamponlu ile ne demek tam olarak bilmiyorum, ama ne soran yapmak oldukça basit ...

so_gen.py (biz izleyebilirsiniz sabit akım yaratılması) :

import time 
import sys 
while True: 
    for char in 'abcdefx': 
     sys.stdout.write(char) 
     sys.stdout.flush() 
     time.sleep(0.1) 

so_filter.py (sormak yapıyor):

import sys 
while True: 
    char = sys.stdin.read(1) 
    if not char: 
     break 
    if char != 'x': 
     sys.stdout.write(char) 
     sys.stdout.flush() 

ne yaptığını görmek için python so_gen.py | python so_filter.py çalıştırmayı deneyin.

+1

kazanan: – flybywire

+1

@flybywire break': Verdiği yanıt gerekli, başka hiçbir cevap yaptılar ... –

13

sys.stdin'dan okuyun ve sys.stdout'a yazın (veya print kullanın). Sizin örnek programı:

import sys 

for line in sys.stdin: 
    print line.replace("x", ""), 

Orada tamponsuz stdin'i yapmak için standart bir yol değildir ve söz konusu istemiyorum. İşletim sistemi arabelleğe alsın.

+2

"Çözülmemiş" demişti ama gerçekten önemli olduğundan emin değilim. –

+0

Cevabımı siz yorumladıktan sonra düzenledim. yazma 'değilse karakter için –

9

Sen Perl elmas operatörü gibi girişler olur işlemek sağlayan fileinput class kullanabilirsiniz. Dokümanlar:

import fileinput 
for line in fileinput.input(): 
    process(line) 

nerede süreç print line.replace('x','') gibi bir şey yok.

Sen stdout'u unbuffer nasıl için this StackOverflow question takip edebilirsiniz. Ya da sadece her print sonra sys.stdout.flush() çağırabilir.

+0

Ah! Bu yaptığım tüm ekstra çalışmaları yapar çünkü Perl'i boşa kaçırdım! Python standart kütüphanesini çok yakından incelemem gerek. –

2

tüm okur ve tamponsuz yazar olmak için piton tercüman -u anahtarını kullanın. Perl'de $| = true; ayarına benzer. Ardından, yaptığınız gibi ilerleyin, onu değiştirip sonra yazdırın. sys.stdout.flush() gerekli değil.

#!/path/to/python -u 

import sys 

for line in sys.stdin: 
    process_line(line) 
+0

Burada çalışmıyor ... –