用python2和python3在stderr上写的函数

时间:2014-06-15 20:01:04

标签: python-3.x python-2.x

我正在编写一个应该同时使用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)

感谢所有答案

1 个答案:

答案 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