2009-10-19 11 views
9

मैं एक प्रोग्राम लिखना चाहता हूं जो stdin (unbuffered) पढ़ता है और stdout (unbuffered) लिखता है कुछ छोटे चार-चार-चार परिवर्तन कर रहा है। उदाहरण के लिए मान लें कि मैं stdin से सभी वर्ण x को हटाना चाहता हूं।मैं अजगर में यूनिक्स फ़िल्टर कैसे लिखूं?

उत्तर

7

मैं बिल्कुल नहीं जानते कि तुम इस संदर्भ में बफ़र से क्या मतलब है, लेकिन यह काफी है कि तुम क्या कह रहे हैं क्या करने के लिए सरल है ...

so_gen.py (एक निरंतर प्रवाह है कि हम देख सकते हैं पैदा) :

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

so_filter.py (कर आप क्या पूछना):

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

को देखने के लिए वह क्या करता है python so_gen.py | python so_filter.py चलाने की कोशिश करें।

+1

विजेता: break' – flybywire

+1

@flybywire: उनका जवाब यह आवश्यक, कोई अन्य जवाब था ... –

13

sys.stdin से पढ़ें और sys.stdout पर लिखें (या print का उपयोग करें)। आपका उदाहरण कार्यक्रम:

import sys 

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

वहाँ unbuffered stdin बनाने के लिए एक मानक तरीका नहीं है, और आपको लगता है कि नहीं करना चाहती। ओएस इसे बफर करने दें।

+2

उन्होंने "unbuffered" कहा लेकिन मुझे यकीन नहीं है कि यह वास्तव में मायने रखता है। –

+0

मैंने आपके उत्तर को संपादित करते समय संपादित किया। लेखन 'नहीं तो चार के लिए –

9

आप fileinput class है, जो आप की प्रक्रिया पर्ल हीरा ऑपरेटर की तरह आदानों होगा की सुविधा देता है का उपयोग कर सकते हैं। दस्तावेज़ों से:

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

जहां प्रक्रिया print line.replace('x','') जैसी कुछ करता है।

आप कैसे stdout unbuffer करने के लिए this StackOverflow question पालन कर सकते हैं। या आप प्रत्येक print के बाद sys.stdout.flush() पर कॉल कर सकते हैं।

+0

आह! यह मेरे द्वारा किए जा रहे सभी अतिरिक्त काम करता है क्योंकि मुझे पर्ल याद नहीं आया! मुझे पाइथन मानक पुस्तकालय के माध्यम से बहुत बारीकी से जाना होगा। –

2

सभी पढ़ता है और unbuffered लिखते हैं बनाने के लिए अजगर दुभाषिया के लिए -u स्विच का उपयोग करें। पर्ल में $| = true; सेट करने के समान। फिर आगे बढ़ें, इसे संशोधित करने वाली रेखा को पढ़ना और फिर इसे प्रिंट करना। sys.stdout.flush() आवश्यक नहीं है।

#!/path/to/python -u 

import sys 

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

यहां काम नहीं कर रहा है ... –

संबंधित मुद्दे