Aff*_*Owl 7 python bash shell command-line
为什么我收到以下一个线性python代码的语法错误?
python -c 'import re; if True: print "HELLO";'
File "<string>", line 1
import re; if True: print "HELLO";
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
以下代码工作得很好
python -c 'if True: print "HELLO";'
Run Code Online (Sandbox Code Playgroud)
如何从命令行更改我的一行以在一行上执行我的预期脚本?
解决此限制的一个选项是$'string'使用换行符转义序列指定具有格式的命令\n.
python -c $'import re\nif True: print "HELLO";'
Run Code Online (Sandbox Code Playgroud)
注意:bash和zsh等shell支持此功能,但POSIX sh无效.
正如@slaadvak所提到的,还有其他一些解决方法:在一行命令行中执行Python多行语句
问题不在于 import 语句,而是在控制流语句之前有任何内容。这也行不通:
dan@dan:~> python -c 'a = "1234" ; if True: print "hi"'
File "<string>", line 1
a = "1234" ; if True: print "hi"
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
根据 Python 参考(https://docs.python.org/2/reference/compound_stmts.html),';' 只能用于将“简单语句”组合在一起。在这种情况下,您将简单的语句import re, 与if True:. if True不是一个简单的语句,因为它引入了流程控制,因此是一个复合语句。至少这就是我解释文档的方式。
以下是 Python 参考的全文:
复合语句由一个或多个“子句”组成。子句由标题和“套件”组成。特定复合语句的子句标题都处于相同的缩进级别。每个子句标题都以唯一标识关键字开始,并以冒号结束。套件是由子句控制的一组语句。一个套件可以是一个或多个分号分隔的简单语句,与标题位于同一行,跟随标题的冒号,或者它可以是后续行的一个或多个缩进语句
compound_stmt ::= if_stmt
| while_stmt
| for_stmt
| try_stmt
| with_stmt
| funcdef
| classdef
| decorated
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
Run Code Online (Sandbox Code Playgroud)