为什么在PowerShell(以及在命令提示符下)中使用单引号将"python -c [command]"中的命令括起来时,它有时不起作用?



在Python文档中它说:

启动解释器的第二种方法是python -c *command* [arg] ...,它在命令中执行语句,类似于 shell 的-c选项。由于 Python 语句通常包含空格或其他对 shell 特殊的字符,因此通常建议用单引号完整引用命令

因此,为了测试此功能,我在PowerShell中尝试了这个:

> py -c 'print("Hello, World!")'

它显示此错误:

File "<string>", line 1
print(Hello, World!)

但是,当我使用双引号代替时,它工作得很好:

> py -c "print('Hello, World!')"

似乎它只发生在字符串上。对于数字,它工作正常。我认为这里的问题与使用引号有关。为什么会这样?

我的猜测是(就像在PowerShell中一样)单引号不会被解释,而是字符串。 这意味着 Python 将第一个测试py -c 'print("Hello, World!")'视为所有字符串,但py -c期望命令。 而使用双引号,python在字符串中查找函数(在测试print()中)并执行它们。

我没有在网上找到这方面的证据,但我们在 powershell 中与这篇博文描述的相同

只是偶然发现了这个问题和这个很棒的答案

简短总结:

  • 它与python -c无关.故障都是PowerShell的。
  • 这是众所周知的事情,并且已经存在多年。
  • PowerShell 对你交给它的命令执行更多的解析和转义,即使你告诉它从字面上处理参数。当调用本机命令(与PowerShell cmdlet相反,在本例中为python)时,PowerShell必须设计单个字符串CommandLine才能调用底层Win32CreateProcess函数。
  • PowerShell 在创建单字符串CommandLine时采用反直觉的转义方法,将从命令行参数中去除双引号,无论是否正确转义。

要绕过此功能,请使用单引号引号或用反斜杠 ("转义所有双引号。(在 PS 中不是有效的转义语法,"将被 PowerShell 忽略,但在从 Windows 进程传递的单字符串命令行构建 argv 数组时,Win32 函数CommandLineToArgvW正确解释,如此处所述。

相关内容

最新更新