2014-06-15 12 views
6

के साथ stderr पर लिखने के लिए फ़ंक्शन मैं एक प्रोग्राम लिख रहा हूं जिसे दोनों पायथन 2 और पायथन 3 के साथ काम करना चाहिए। इसके लिए, मैं stderr को लिखने के लिए एक फ़ंक्शन रखना चाहता हूं जो दोनों पायथन संस्करणों के साथ काम करता है।python2 और python3

आदर्श मैं की तरह कुछ हो जाएगा लगता है:

def writeStdErr(message): 
    if sys.version_info >= (3, 0): 
     print(message, end = "", file = sys.stderr) 
    else: 
     sys.stderr.write(message) 

यह है कि को Python2 है के साथ समस्या यह है कि प्रिंट कार्य नहीं है, इसलिए मैं

print(message, end = "", file = sys.stderr) 
        ^
SyntaxError: invalid syntax 

मैं से छुटकारा पाने सकता है मिल यह केवल eval जोड़कर:

def writeStdErr(message): 
    if sys.version_info >= (3, 0): 
     eval('print(message, end = "", file = sys.stderr)') 
    else: 
     sys.stderr.write(message) 

हालांकि, मैं इस समाधान को नापसंद करता हूं; मुझे लगता है कि eval का उपयोग करना सामान्य बात है।

क्या कोई बेहतर कुछ जानता है/बेहतर समाधान है?

संपादित करें:

भविष्य में ये समस्या हो रही किसी के लिए, निम्नलिखित बातें लगते हैं काम करता है:

def writeStdErr(message): 
    sys.stderr.write(message) 

या

from __future__ import print_function 
import sys 
def writeStdErr(message): 
    print(message, file=sys.stderr) 

सभी प्रश्नों के उत्तर के लिए धन्यवाद

+0

'sys.stderr.write (message)' पायथन 3 के तहत भी काम नहीं करता है? क्यों न सिर्फ सभी संस्करणों के लिए इसका उपयोग करें? – jwodder

+0

कोई sys.stderr.write दुर्भाग्य से पायथन 3 के तहत काम नहीं करता है। Thats मैं यह जांचना चुनता हूं कि कौन सा पायथन संस्करण – quant

+1

चला रहा है मैंने अभी संस्करण 3.1 और 3.3 में परीक्षण किया है, और 'sys.stderr.write (' foo ')' दोनों में काम किया है। जब आप इसे करने का प्रयास करते हैं तो क्या होता है? – jwodder

उत्तर

6

यदि आप Python2.7 का उपयोग कर रहे हैं, तो आप ca n नया व्यवहार आयात करें:

from __future__ import print_function 

यह कोड की पहली पंक्ति होनी चाहिए (लेकिन शेबांग के बाद जा सकती है)।

पिछले संस्करणों के साथ एक और वैकल्पिक संगत बाहरी मॉड्यूल में इसे बनाना है।

if sys.version_info >= (3, 0): 
    from print_sderr3 import writeStdErr 
else: 
    from print_stderr2 import writeStdErr 

जहां आपने तदनुसार प्रत्येक को लागू किया है।

यह आपके प्रश्न का उत्तर देना है, लेकिन, आप दोनों के लिए sys.stderr.write का उपयोग कर सकते हैं। केवल अंतर यह है कि पायथन 3 में यह लिखे गए पात्रों की संख्या को वापस करने लगता है। आप इंटरैक्टिव मोड पर यह करते हैं:

>>> sys.stderr.write('aaaa\n') 
aaaa 
5 

आप एक अतिरिक्त 5 मिलता है, लेकिन है कि बस वापसी मान है।

>>> a = sys.stderr.write('aaaa\n') 
aaaa 
>>> a 
5 
संबंधित मुद्दे