2013-08-24 5 views
11

मैं कुछ असामान्य स्थिति में चला गया है। मैं स्क्रिप्ट के लिए इंटरेक्टिव कंसोल (शिक्षण/परीक्षण प्रयोजनों के लिए) कोशिश कर रहा हूँ, और मैं निम्नलिखित की कोशिश की:पाइथन के इंटरैक्टिव प्रॉम्प्ट ">> "आउटपुट कहां है?

$ python > /dev/null 
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:52:43) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print 3 
>>> 

3 मुद्रित नहीं है, इसलिए स्पष्ट रूप से सब कुछ stderr पर था। अब तक सब ठीक है। लेकिन तब हम अनुप्रेषित stderr:

$ python 2> /dev/null 
>>> print 3 
3 
>>> 

कैसे शीघ्र दोनों ही मामलों में मुद्रित किया जा सकता?

संपादित करें: stdout और stderr दोनों को पुनर्निर्देशित करने के लिए बिल्कुल कुछ भी मुद्रित नहीं होता है। तो पाइथन स्पष्ट रूप से stdout या stderr में से एक "चुनना" है। क्या ऐसा होने वाला दस्तावेज है? मैं यह नहीं समझ सका कि यह वास्तव में पायथन स्रोत कोड में कैसे किया जाता है।

+2

हू, यह अजीब बात है। शायद यह 'isatty' की जांच करता है? – delnan

+0

यह मेरा अनुमान होगा, लेकिन मुझे लगता है कि पाइथन वास्तव में ऐसा नहीं करता है। अजीब चीज यह है कि 'PyOS_StdioReadline', जो फ़ंक्शन इनपुट पढ़ने के लिए ज़िम्मेदार प्रतीत होता है, को' stderr' पर प्रॉम्प्ट प्रिंट करने के लिए हार्डकोड किया जाता है। यदि 'stderr' को' stdout' पर रीडायरेक्ट किया गया था, जैसा कि दूसरा उदाहरण सुझाता है, हमें बैनर देखना चाहिए। – nneonneo

+1

पायथन को पढ़ाने के लिए डिज़ाइन किए गए टूल का उपयोग करना आसान हो सकता है, जैसे [आईपीथॉन की नोटबुक सुविधा] (http://ipython.org/notebook.html)। –

उत्तर

4

यह अजगर चेकों की तरह लगता है कि क्या stdout एक tty है: रेखा के आसपास Parser/myreadline.c से

/* This is needed to handle the unlikely case that the 
* interpreter is in interactive mode *and* stdin/out are not 
* a tty. This can happen, for example if python is run like 
* this: python -i < test1.py 
*/ 
if (!isatty (fileno (sys_stdin)) || !isatty (fileno (sys_stdout))) 
    rv = PyOS_StdioReadline (sys_stdin, sys_stdout, prompt); 
else 
    rv = (*PyOS_ReadlineFunctionPointer)(sys_stdin, sys_stdout, 
             prompt); 

Sourcecode 194.

ऐसा नहीं है कि दुभाषिया स्टार्टअप पर readline मॉड्यूल आयात संभव है, जिस स्थिति PyOS_ReadlineFunctionPointer होगा में call_readline पर सेट किया गया है, जो readline लाइब्रेरी का उपयोग करता है। विशेष रूप से यह rl_callback_handler_install पर कॉल करता है। इस फ़ंक्शन का दस्तावेज़ यह नहीं बताता है कि प्रॉम्प्ट मुद्रित किया गया है, लेकिन यह संभव है कि यह जांचता है कि stdout/stderrtty एस हैं।

+0

इसके ठीक ऊपर, हालांकि, यह 'PyOS_ReadlineFunctionPointer' को 'PyOS_StdioReadline' पर सेट करना प्रतीत होता है (VMS को छोड़कर, जिसे मैं निश्चित रूप से चालू नहीं करता)। – nneonneo

+0

@nneonneo हाँ, मैं थोड़ा परेशान हूं, लेकिन यह एकमात्र संदर्भ है जिसे मैं पा सकता हूं जो किसी भी तरह से आपके द्वारा देखे जाने वाले व्यवहार को समझा सकता है। क्या आपके पास रीडलाइन लाइब्रेरी उपलब्ध है? क्योंकि फ़ाइल की शुरुआत में यह उल्लेख करता है कि यह उपलब्ध होने पर इसका उपयोग करता है। – Bakuriu

+0

@nneonneo यह केवल तभी सेट करता है जब यह 'न्यूल' न हो। यदि दुभाषिया स्टार्टअप के दौरान 'रीडलाइन' आयात करता है तो 'रीडलाइन' मॉड्यूल अपना फ़ंक्शन सेट करेगा (' मॉड्यूल/readline.c' पर init फ़ंक्शन देखें), और इस प्रकार 'PyOS_Readline'' PyOS_StdioReadline' का उपयोग नहीं करेगा। – Bakuriu

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