在Python中,"SyntaxError: Missing parentheses in call to 'print'"是什么意思?

460
当我尝试在Python中使用print语句时,它会给我返回以下错误信息:
>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: Missing parentheses in call to 'print'

那是什么意思?
查看使用关键字参数end=' '打印时出现SyntaxError错误以了解相反的问题。
查看Python 3中无括号打印以获取解决方法,并确认在Python 3中无法将print作为语句使用。

注意特殊情况:错误消息可能会有所不同,这取决于确切的 Python 版本(更新版本提供明确的建议 Did you mean print("Hello, World!")?)和应该打印什么(例如,在 3.8 中,print int()只会给出 SyntaxError: invalid syntax)。 - Karl Knechtel
(显然,非常旧的版本只会显示SyntaxError: invalid syntax,即使给出了一个字符串字面量。) - undefined
11个回答

679
这个错误消息意味着您试图使用Python 3来跟随一个使用Python 2的print语句的示例或运行程序。
print "Hello, World!"

上述语句在Python 3中无效。在Python 3中,您需要在要打印的值周围添加括号:

print("Hello, World!")

“SyntaxError: Missing parentheses in call to 'print'” 是 Python 3.4.2 中新增的错误提示信息,主要是为了帮助那些在运行 Python 3 的同时尝试遵循 Python 2 教程的用户。

在 Python 3 中,打印值已经从一个独立的语句变成了普通的函数调用,因此现在需要使用括号:

>>> print("Hello, World!")
Hello, World!

在Python 3的早期版本中,解释器仅报告通用的语法错误,没有提供任何有用的提示来帮助确定问题的原因:
>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: invalid syntax

关于为什么在Python 3中print成为了普通函数,这与语句的基本形式无关,而是因为你如何做更复杂的事情,比如在stderr上打印多个项目并以尾随空格结束而不是结束行。

在Python 2中:

>>> import sys
>>> print >> sys.stderr, 1, 2, 3,; print >> sys.stderr, 4, 5, 6
1 2 3 4 5 6

在Python 3中:
>>> import sys
>>> print(1, 2, 3, file=sys.stderr, end=" "); print(4, 5, 6, file=sys.stderr)
1 2 3 4 5 6

自2017年9月发布的Python 3.6.3版本开始,与Python 2.x的print语法相关的一些错误消息已经更新,建议使用Python 3.x的相应语法。
>>> print "Hello!"
  File "<stdin>", line 1
    print "Hello!"
                 ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?

"Missing parentheses in call to print"错误是编译时语法错误,因此可以访问原始源代码,并且能够在建议的替换中包含该行其余部分的完整文本。但它目前不会尝试确定应在该表达式周围放置哪些适当的引号(这并非不可能,只是足够复杂以至于还没有完成)。

对于右移操作符引发的TypeError也已经进行了自定义:

>>> 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>)"?

由于该错误是在代码运行时引发的,而不是在编译时引发的,因此它无法访问原始源代码,因此在建议替换表达式中使用元变量(<message><output_stream>),而不是用户实际输入的内容。与语法错误情况不同的是,在自定义右移错误消息中在Python表达式周围放置引号是直截了当的。


4
感谢@antti-haapala在文章开头添加了摘要,直接回答了问题,然后才进一步解释错误信息的起源。 - ncoghlan
我还将答案切换为社区维基,因为对于这个问题稳定地积累更多的SO声望对我来说感觉不太合适(请参见http://bugs.python.org/issue21669,了解错误消息和此SO问题如何共同演变的背景)。 - ncoghlan
5
你好!我认为这个工具可以帮助某些人 https://docs.python.org/2/library/2to3.html - Jhonatas Kleinkauff
1
在你的2.7文件中添加一行from future import print_function,以便将新的Python 3的print()函数添加到你的代码中。因此,代码将变得兼容于2.7+和3.0+。 - MasterControlProgram
@Praxiteles 你可以使用update-alternatives来设置你偏好的Python版本:sudo update-alternatives --config python 并设置默认版本。 - Chef Pharaoh
显示剩余2条评论

37

很遗憾,早期的xkcd漫画已经不再完全适用。

https://imgs.xkcd.com/comics/python.png

自Python 3.0版本以后,你需要编写:

print("Hello, World!")

还有人需要编写那个 antigravity 库 :(


14
反重力确实存在,不过你尝试导入过了吗? ;) - tyrion

26

Python 2和Python 3的语法有所不同。

Python 2中,

print "Hello, World!" 

会起作用,但在Python 3中,请使用括号

print("Hello, World!")

这与Scala语法相当,并且接近于Java。


只有那些想要破坏一门语言的人才会改变其语法到那种程度。自然而然的做法是保留两种语法都有效。 - Bran
@Bran 完全不是这样。在整个语言中只有一个函数,基于其名称可以使用另一种语法来调用,这完全没有意义。顺便说一下,你的评论是在第一个3.x版本发布近12年后发表的,而且在开发团队已经完全停止支持2.x(包括安全修复)之后(这是在他们做出特殊例外以适应迁移的常规发布计划之后),此时绝大多数Python开发人员已经愉快地使用3.x了。 - Karl Knechtel
在一种编程语言中,这样的向后兼容性无望。在广泛使用中。 - Tore Aurstad

15
在Python 3.x中,print现在是一个函数,而不是2.x中的语句
因此,调用时需要将print作为函数使用,因此需要括号: Python 2.x: print "Lord of the Rings" Python 3.x: print("Lord of the Rings")
使print成为函数有多个优点:
  • print函数在打印多个值(它们现在是函数的参数)时提供更多的灵活性。特别是,它允许使用参数扩展
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+')
foo+bar+baz
  • 通过编写一个名为print的新函数,可以替换对print的调用行为。这是使用print语句无法实现的。

此外,print 函数可以作为高阶函数使用,即传递给其他函数。然而,这种情况很少出现。 - Karl Knechtel

8

如果你的代码需要在Python 2和3中都可以运行,你可以在程序开头加载以下内容来实现:

from __future__ import print_function   # If code has to work in Python 2 and 3!

接下来,您可以按照Python 3的方式打印:

print("python")

如果你想在不换行的情况下打印出内容,可以使用以下方法:
for number in range(0, 10):
    print(number, end=', ')

1
即使使用了那个导入,在Python3中对我没有起作用。代码没有括号。 - logicbloke

6
在Python 3中,你只能这样打印:
print("STRING")

但是在Python 2中,括号并不是必需的。

5

我想强调一下,我了解Python2.7Python3之间的语法变化,并且我的代码以正确的方式编写,如print("string")甚至print(f"string")……

但是在调试了一段时间后,我意识到我的bash脚本是这样调用python的:

python file_name.py

它默认使用python2.7来运行我的python脚本,导致出现错误。所以我将我的bash脚本改为:

python3 file_name.py

这当然使用python3来运行脚本,从而解决了错误。


你也可以在文件顶部添加一个 shebang 来指定使用哪个 Python 加载该文件。 - OneCricketeer

3

print('你好,世界!')

你正在使用Python 3,在打印时需要使用括号。


3

我遇到了这个错误

from trp import BoundingBox, Document
File "C:\Users\Kshitij Agarwal\AppData\Roaming\Python\Python39\site-packages\trp\__init__.py", line 31
print ip
      ^ 
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(ip)?

这是一个Python包错误,可能是因为使用了Python2而你正在运行Python3。
一种解决方法是将Python2中的print something转换为每个文件夹中每个文件中的Python3 print(something),但这不是一个好主意。我的意思是,你可以这样做,但还有更好的方法。
为了执行相同的任务,在Python中有一个名为2to3的包,它将Python2脚本转换为Python3脚本。要安装它,请在终端中执行以下命令...
pip install 2to3

然后在终端中将目录更改为包文件所在的位置,例如我的情况是- C:\Users\Kshitij Agarwal\AppData\Roaming\Python\Python39\site-packages\trp

现在执行命令

2to3 . -w

然后,,该目录中的所有Python2文件都将转换为Python3

注意:上述命令也适用于其他操作系统。只有Python包路径会根据系统而异。


2
除了直接回答之外,人们应该注意Python 2和3之间的另一个关键区别。官方Python Wiki涵盖了几乎所有主要差异,并重点介绍了何时应该使用其中的任何一个版本。这篇博客文章也很好地解释了当前的Python世界和迁移到Python 3的某种未解之谜。
据我所知,您正在开始学习Python语言。在您继续学习Python 3之前,应该考虑上述文章。您不仅需要更改一些语法,还需要考虑哪些软件包对您可用(Python 2的优势)以及可能在您的代码中进行的潜在优化(Python 3的优势)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接