我正在编写一个应该同时使用python2和python3的程序。 为此,我希望有一个函数可以写入适用于两个python版本的stderr。
理想我认为会是这样的:
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 :(得分:11)
如果您使用的是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