在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
正确解释,如此处所述。