функция записи в 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