2014-06-15 10 views
6

Piszę program, który powinien działać zarówno z python2, jak i python3. W tym celu chciałbym mieć funkcję zapisu na stderr, która działa z obu wersjach python.funkcja do pisania na stderr z python2 i python3

Idealny myślę byłoby coś takiego:

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

problem z tym, że python2 jest, że druk nie jest funkcją, więc mogę

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

mogłem pozbyć to przez dodanie eval:

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

jednak nie podoba mi się to rozwiązanie; Myślę, że używanie eval jest złym pomysłem.

Czy ktoś wie coś lepszego/ma lepsze rozwiązanie?

EDIT:

Dla każdego, mającego ten sam problem w przyszłości, następujące rzeczy wydają się utwory:

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

lub

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

Dzięki wszystkim odpowiedzi

+0

Czy "sys.stderr.write (message)' również nie działa w Pythonie 3? Dlaczego po prostu nie użyć tego dla wszystkich wersji? – jwodder

+0

no sys.stderr.write nie działa niestety pod python3. Właśnie dlatego wybieram sprawdzenie, która wersja python działa – quant

+1

Właśnie testowałem w wersjach 3.1 i 3.3, a 'sys.stderr.write ('foo')' działało w obu. Co się stanie, gdy spróbujesz to zrobić? – jwodder

Odpowiedz

6

Jeśli używasz Python2.7, masz ok n zaimportuj nowe zachowanie:

from __future__ import print_function 

To powinno być pierwszą linijką kodu (ale może chodzić za szelakiem).

Kolejną alternatywą zgodną z wcześniejszymi wersjami jest utworzenie jej w module zewnętrznym.

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

gdzie odpowiednio zaimplementowano każdy z nich.

To jest odpowiedź na twoje pytanie, ALE, możesz po prostu użyć sys.stderr.write dla obu. Jedyna różnica polega na tym, że w Pythonie 3 wydaje się zwracać liczbę zapisanych znaków. Jeśli zrobisz to na trybie interaktywnym:

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

uzyskać dodatkowy 5, ale to tylko wartość zwracana.

>>> a = sys.stderr.write('aaaa\n') 
aaaa 
>>> a 
5 
Powiązane problemy