为啥 `python -c 'print('howdy')'` 会产生错误(在 zsh 中),但 `python -c 'print("howdy")'` 不会?

Posted

技术标签:

【中文标题】为啥 `python -c \'print(\'howdy\')\'` 会产生错误(在 zsh 中),但 `python -c \'print("howdy")\'` 不会?【英文标题】:Why does `python -c 'print('howdy')'` produce an error (in zsh), but `python -c 'print("howdy")'` does not?为什么 `python -c 'print('howdy')'` 会产生错误(在 zsh 中),但 `python -c 'print("howdy")'` 不会? 【发布时间】:2021-08-31 09:23:03 【问题描述】:

当我在zsh 中从命令行执行python -c 'print('howdy')' 时,会产生以下错误。

Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'howdy' is not defined

但是,这个python -c 'print("howdy")' 没有,而是产生了我期望的输出,即howdy(作为字符串)被发送到stdout

我认为 python 对单引号或双引号是不可知的

【问题讨论】:

Python 不介意您使用的是哪个引号字符,但在您的第一个示例中,您在引号中提供了 print() 在第一个版本中,您使用相同类型的引号来表示两种不同的东西。 你试过转义内引号吗? 【参考方案1】:

Zsh 首先解析命令,遵循它自己的引号规则。对于 zsh,命令 python -c 'print('howdy')' 类似于以下内容:

我们正在调用程序python 第一个参数是-c 第二个参数是用引号括起来的'print(',然后是howdy,然后是用引号括起来的')'

Zsh 将第二个参数“扩展”为'print(howdy)'。如果你在 python 中运行这个命令,你会得到你描述的错误。

【讨论】:

正确的术语是引号删除。 'print('howdy')' 是一个单词,其中两部分包含在单引号中。一旦 shell 处理完命令行,命令名称被标识为 python,两个词 -cprint(howdy) 被标识为命令的参数。

以上是关于为啥 `python -c 'print('howdy')'` 会产生错误(在 zsh 中),但 `python -c 'print("howdy")'` 不会?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们在导入 print_function 后调用 print(在 Python 2.6 中)

python selenium 为啥print打印不出来

为啥print("内容\n"+8)不能运行?

python常用函数总结

新手提问 python for循环问题 print (y) #这里为啥只输出一行?

Linux 上的 Python Wheels(如何?为啥?)