2012-08-03 14 views
9

हर मैं मेरे अजगर स्क्रिप्ट पर कार्य कर रहा हूँ, यह इस लाइन पर लटका दिखाई देता है:sys.stdin.readlines() लटका हुआ अजगर स्क्रिप्ट

lines = sys.stdin.readlines() 

क्या मैं ठीक करने के लिए क्या करना चाहिए/इससे बचने के?

lines = sys.stdin.readlines() 
updates = [line.split() for line in lines] 

संपादित 2

मैं एक Git हुक से इस स्क्रिप्ट चल रहा हूँ तो वहाँ वैसे भी चारों ओर है:

संपादित

यहाँ है कि मैं क्या lines साथ कर रहा हूँ है ईओएफ?

+0

ध्यान दें कि रीडलाइन() को वापस आने से पहले एक ईओएफ की आवश्यकता होती है। यह तब तक नहीं होगा जब तक कि निष्पादन अनुप्रयोग/खोल के माध्यम से stdin को ईओएफ नहीं दिया जाता है। –

उत्तर

13

यह जो कुछ आप पूरा करने की कोशिश कर रहे हैं उस पर बहुत निर्भर करता है। आप में सक्षम करते हैं हो सकता है:

for line in sys.stdin: 
    #do something with line 
बेशक

, इस मुहावरे के साथ के साथ ही readlines() विधि का प्रयोग कर रहे हैं, तो आप किसी भी तरह अपनी स्क्रिप्ट को EOF चरित्र भेजने के लिए इतना है कि यह जानता है कि फ़ाइल के लिए तैयार है की जरूरत है पढ़ें। (यूनिक्स पर Ctrl-D आमतौर पर चाल करता है)।

+0

@ जेसनमोक - हाँ, मुझे एहसास है कि (यही कारण है कि मैं कहता हूं "ताकि यह जान सके कि फ़ाइल पढ़ने के लिए पढ़ी जाती है")। – mgilson

+0

मैं इस स्क्रिप्ट को गिट हुक से चला रहा हूं तो क्या ईओएफ के आसपास वैसे भी है? –

+0

@ बोआ - क्षमा करें, मुझे गिट हुक के बारे में कुछ भी पता नहीं है, हालांकि ऐसा लगता है कि यदि आपका प्रोग्राम पाइप से पढ़ रहा है, तो यह सिर्फ काम करना चाहिए। – mgilson

5

जब तक आप stdin कि उम्मीद होगी व्यवहार के लिए कुछ पुनः निर्देशित कर रहे हैं। यह stdin से इनपुट पढ़ने के लिए कहता है (जो कंसोल होगा जिससे आप स्क्रिप्ट चला रहे हैं)। यह आपके इनपुट की प्रतीक्षा कर रहा है।

देखें: "How to finish sys.stdin.readlines() input?

2

आप एक इंटरैक्टिव सत्र में कार्यक्रम चला रहे हैं, तो इस लाइन (यानी अपने कीबोर्ड) मानक इनपुट से पढ़ने के लिए जब तक आप EOF चरित्र भेज अजगर का कारण बनता है (Ctrl - डी (यूनिक्स/मैक) या Ctrl - जेड (विंडोज़))।

>>> import sys 
>>> a = sys.stdin.readlines() 
Test 
Test2 
^Z 
>>> a 
['Test\n', 'Test2\n'] 
3

मैं इस सीधे आपके सवाल का जवाब नहीं है, के रूप में दूसरों को पहले से ही EOF मुद्दे को संबोधित किया है, लेकिन जब एक लंबे रहते थे उपप्रक्रिया या stdin से लाइव उत्पादन पढ़ने आम तौर पर मैं क्या पाया है कि सबसे अच्छा काम करता जबकि/अगर लाइन दृष्टिकोण है:

while True: 
    line = sys.stdin.readline() 
    if not line: 
     break 
    process(line) 

इस मामले में, sys.stdin.readline() एक EOF दिया जाता है से पहले पाठ की तर्ज वापस आ जाएगी। एक बार ईओएफ दिए जाने पर, खाली लाइन लौटा दी जाएगी जो लूप से ब्रेक को ट्रिगर करती है। एक लटका तब भी हो सकता है जब तक कि एक ईओएफ प्रदान नहीं किया जाता है।

यह ध्यान देने योग्य है कि, "लाइव उत्पादन" कार्रवाई करने के लिए, जबकि उपप्रक्रिया/stdin अभी भी चल रहा है की क्षमता है, यह उत्पादन है फ्लश करने के लिए लेखन आवेदन की आवश्यकता है लायक है।

+1

मुझे लगता है कि @ mgilson का जवाब बेहतर काम करेगा; यह काम करेगा, लेकिन यह अधिक "पायथनिक" तरीका – pbfy0

+0

है, मैं पूरी तरह से इस कथन से सहमत हूं कि @ mgilson का जवाब अधिक पाइथनिक है। मुझे बस "लाइव आउटपुट" के लिए बहुत दोस्ताना नहीं मिला है, जैसे उपयोगकर्ता को स्थिति की रिपोर्ट करने के लिए लंबे समय तक चलने वाले एप्लिकेशन से स्टेटस जानकारी कैप्चर करना, क्योंकि लूप शुरू होने से पहले ऑब्जेक्ट जैसी ईओएफ उत्पन्न करने की आवश्यकता होती है प्रसंस्करण। मेरे उदाहरण में, ईओएफ वापस आने से पहले टेक्स्टलाइन() को कॉल करने से मुझे टेक्स्ट की लाइनें मिलेंगी। मुझे एक खाली रेखा देकर, केवल ईओएफ को तोड़ने की आवश्यकता होती है। ऐसा कहा जा रहा है, मैं शायद अपना विवरण सुधार सकता हूं क्योंकि यह बहुत स्पष्ट नहीं है। –

+0

यह लिनक्स पर मेरे लिए लाइन-बाय-लाइन चलाता है ... – pbfy0

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