функция записи в stderr с python2 и питон3

Я пишу программу, которая должна работать как с python2, так и с python3. Для этого я хотел бы иметь функцию для записи в stderr, которая работает с обеими версиями python.

идеально, я думаю, было бы что-то вроде:

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)

тем не менее, мне не нравится это решение; я думаю, что это генерал a плохая идея использовать eval.

кто-нибудь знает что-то лучше/есть лучшее решение?

EDIT:

для тех, кто имеет ту же проблему в будущем, следующие вещи, кажется, работает:

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

или

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

спасибо всем ответы

1 ответов


если вы используете Python2.7, Вы можете импортировать новое поведение:

from __future__ import print_function

это должна быть первая строка кода (но может пойти после shebang).

Другой альтернативой, совместимой с более ранними версиями, является создание его во внешнем модуле.

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

где вы реализовали каждый из них соответственно.

вот ответ на ваш вопрос, но, вы можете просто использовать sys.stderr.write для обоих. Единственная разница в том, что Python 3, похоже, возвращает количество написанных символов. Если вы делаете это в интерактивном режиме:

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

вы получаете дополнительный 5, но это только возвращаемое значение.

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