Python 3 操作符 >> 输出到文件

33 投票
4 回答
48334 浏览
提问于 2025-04-17 12:48

我有一段Python代码,用来写一个项目的依赖文件。在Python 2.x上运行得很好,但在用Python 3测试时却报了错。

depend = None
if not nmake:
    depend = open(".depend", "a")
dependmak = open(".depend.mak", "a")
depend = open(".depend", "a")
print >>depend, s,

这是报错信息:

Traceback (most recent call last):
  File "../../../../config/makedepend.py", line 121, in <module>
    print >>depend, s,
    TypeError: unsupported operand type(s) for >>:
      'builtin_function_or_method' and '_io.TextIOWrapper'

有什么好的办法让这段代码在Python 2.x和3.x上都能正常工作吗?

4 个回答

3

请注意,从Python 3.6.3版本开始(2017年9月),这个情况下的错误提示信息会变成推荐使用Python 3的写法:

>>> print >> sys.stderr
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>:
    'builtin_function_or_method' and '_io.TextIOWrapper'.
    Did you mean "print(<message>, file=<output_stream>)"?

(这里添加了明显的换行,以避免横向滚动 - 实际的错误信息会根据你终端窗口的宽度自动换行)

12

print() 是 Python 3 中的一个函数。

你可以把你的代码改成 print(s, end="", file=depend)或者让 2to3 工具来帮你处理。

47

在Python 3中,打印的方式变成了一个函数。新的写法是这样的:

print(s, end="", file=depend)

这个变化意味着,如果你在写文件的时候用打印功能,Python 2和Python 3的代码不能通用。一个可行的办法是用depend.write(s)来代替打印。

更新:J.F. Sebastian正确指出,你可以在Python 2的代码中使用from __future__ import print_function来启用Python 3的写法。这样就可以在不同版本的Python中使用相同的代码了。

撰写回答