为啥 `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
,两个词 -c
和 print(howdy)
被标识为命令的参数。以上是关于为啥 `python -c 'print('howdy')'` 会产生错误(在 zsh 中),但 `python -c 'print("howdy")'` 不会?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我们在导入 print_function 后调用 print(在 Python 2.6 中)