2009-12-12 3 views
5

मैं यूनिक्स पर कमांडलाइन से अपनी पायथन प्रक्रिया में लिख रहा हूं। मैं ईओएफ (या किसी भी तरह से stdin बफर फ्लश करना चाहता हूं, इसलिए पाइथन मेरे इनपुट को पढ़ सकता है।)कमांडलाइन से पायथन sys.stdin को EOF कैसे भेजें? CTRL-D काम नहीं करता

अगर मैं CTRL-C दबाता हूं, तो मुझे कीबोर्ड एरर मिलता है।

अगर मैं CTRL-D दबाता हूं, तो प्रोग्राम बस बंद हो जाता है।

मैं stdin buffer कैसे फ्लश कर सकता हूं?

+2

जैसे ही आप टर्मिनल करते हैं, जैसे ही टर्मिनल काम करते हैं, आपका इनपुट पायथन को भेजा जाता है। –

+0

यदि आप यह बदलना चाहते हैं कि यह कैसे काम करता है, तो पाइथन को टर्मिनल सेटिंग्स बदलनी है, जो काला जादू है ... शायद 'टर्मियोस' मॉड्यूल देखें? http://docs.python.org/library/termios.html –

उत्तर

1

यदि आप 'l में sys.stdin' का उपयोग करते हैं, तो यह buffered है।

आप उपयोग कर सकते हैं:

while 1: 
    l = sys.stdin.readline() 
+0

वैसे भी यह buffered है। दोनों के बीच कोई अंतर नहीं है। –

+0

असल में, उपरोक्त मेरे लिए काम किया। मुझे लगता है कि मैंने मेलिंग सूची पर पढ़ा है कि 'sy insts.stdin' में एक अतिरिक्त आंतरिक बफर है, जबकि sys.stdin.readline() नहीं है। –

+2

@ जेसनऑरेन्डॉर्फ: वास्तव में [रीड-बफर बफर बग] (http://bugs.python.org/issue3907) के कारण पायथन 2 पर एक अंतर है। आप 'इन लाइनर इन लाइनर (sys.stdin.readline,' ') का उपयोग कर सकते हैं:' इसे काम करने के लिए। 'बिल्ली | चलाने की कोशिश करो python2 -u -c "" और कुछ इनपुट टाइप करें। 'readline()' variant लाइनों को तत्काल उपलब्ध होने की ओर ले जाता है। – jfs

11

नियंत्रण-डी नहीं करना चाहिए अपने कार्यक्रम "बस रोक" - यह मानक इनपुट बंद हो जाना चाहिए, और उस के साथ अपने कार्यक्रम सौदों ठीक से, यह पूरी तरह से अच्छी तरह से करता है, तो जारी रख सकते हैं, तो यह करने की जरूरत है!

उदाहरण के लिए

, निम्नलिखित st.py दिया:

import sys 

def main(): 
    inwas = [] 
    for line in sys.stdin: 
    inwas.append(line) 
    print "%d lines" % len(inwas), 
    print "initials:", ''.join(x[0] for x in inwas) 

if __name__ == '__main__': 
    main() 
कुछ

हम देख सकते हैं

तरह
$ python st.py 
nel mezzo del cammin di nostra vita 
mi ritrovai per una selva oscura 
che la diritta via era smarrita 
3 lines initials: nmc 
$ 

यदि नियंत्रण-डी मारा जाता है सही होने के बाद तीसरी पंक्ति में प्रवेश - कार्यक्रम यह समझता है कि मानक इनपुट किया जाता है, और सभी स्वच्छ और उचित आवश्यक पोस्ट-प्रोसेसिंग करता है।

अपने कार्यक्रम समय से पहले ही नियंत्रण-डी पर बाहर निकल जाता है, तो यह बुरी तरह से कोडित किया जाना चाहिए - क्या संपादन के बारे में आप छोटी से छोटी "अनुचित व्यवहार कर रहा" कार्यक्रम आप के गर्भ धारण कर सकते हैं जोड़ने के लिए सवाल है, तो हम आप वास्तव में दिखा सकते हैं आप कैसे जा रहे हैं गलत?

2

मुझे लगता है कि मुझे पता है कि क्या हो रहा है। आप enter पर मारने के बिना ctrl-D पर मार रहे हैं। यदि आप प्रोग्राम में एक लाइन भेजना चाहते हैं, तो बस एंटर दबाएं। यदि आप ctrl-D को enter पर मारने के बिना हिट करते हैं, तो आप ctrl-D फिर से हिट कर सकते हैं और आपके प्रोग्राम को तब लाइन देखना चाहिए। इस मामले में (दो ctrl-D एस उत्तराधिकार में), आपके कार्यक्रम को लाइन के अंत में एक नई लाइन नहीं दिखाई देगी।

उदाहरण के लिए, मान लीजिए कि मैं एक अजगर स्क्रिप्ट a.py डालते हैं:

import sys 

for line in sys.stdin: 
    sys.stdout.write('%s' % line) 

और मैंने इसे निष्पादित करें:

$ python a.py 

और फिर यह डालें:

line 1 
line 2<ctrl-D><ctrl-D> 

कार्यक्रम प्रिंट करेगा:

line 1 
line 2$ 

$ शेल-प्रॉम्प्ट है। उपरोक्त इनपुट के साथ एक पूर्ण सत्र यहां दिया गया है:

$ पायथन ए।py
लाइन 1
लाइन 2 पंक्ति 1
लाइन 2 $

(बोल्ड दिखाने के कार्यक्रम के उत्पादन। रोमन मामले दिखा रहा क्या टाइप, बिना दो ctrl-D रों के लिए है)

यदि ऐसा नहीं हो रहा है, तो आपको जो कुछ भी कर रहे हैं उसके बारे में हमें और बताना होगा।

1
try: 
    # You might be inside the while-loop 
    foo = raw_input('Spam: ') # Or whatever... 
except EOFError: 
    print 'And now for something completely different.' 
    sys.exit() 
संबंधित मुद्दे