为什么我收到以下一个线性python代码的语法错误?
python -c 'import re; if True: print "HELLO";'
File "<string>", line 1
import re; if True: print "HELLO";
^
SyntaxError: invalid syntax
以下代码可以正常使用
python -c 'if True: print "HELLO";'
如何从命令行更改我的一行以在一行上执行我想要的脚本?
答案 0 :(得分:8)
解决此限制的一个选项是使用换行符转义序列$'string'
指定具有\n
格式的命令。
python -c $'import re\nif True: print "HELLO";'
注意:bash和zsh等shell支持此功能,但POSIX sh无效。
如@slaadvak所述,此处还有其他一些解决方法:Executing Python multi-line statements in the one-line command-line
答案 1 :(得分:4)
问题不在于具体的import语句,而是在控制流语句之前有任何内容。这不会起作用:
dan@dan:~> python -c 'a = "1234" ; if True: print "hi"'
File "<string>", line 1
a = "1234" ; if True: print "hi"
^
SyntaxError: invalid syntax
根据Python参考文献(https://docs.python.org/2/reference/compound_stmts.html),&#39;;&#39;只能用于组合&#34;简单陈述&#34;一起。在这种情况下,您将简单语句import re
与if True:
结合起来。 if True
不是一个简单的陈述,因为它引入了流量控制,因此是一个复合陈述。至少我是如何理解文档的。
这里是Python参考文献的全文:
复合语句由一个或多个'子句'组成。一个子句 由标题和'套件组成'。特定的子句标题 复合语句都在同一缩进级别。每个条款 标头以唯一标识关键字开头,以a结尾 结肠。套件是由子句控制的一组语句。一个 套件可以是一个或多个以分号分隔的简单语句 与标题相同的行,在标题的冒号后面,或者它可以是 后续行中的一个或多个缩进语句
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)* [";"]
答案 2 :(得分:1)
您可以直接在参数中嵌入换行符。
$ python -c 'import re
> if True:
> print "HELLO"
> '
答案 3 :(得分:1)
为什么我收到以下一个线性python代码的语法错误?
Python grammar可能会禁止small_stmt ';' compound_stmt
。 -c
参数可能被解释为file_input
:
fileinput: (NEWLINE | stmt)* ENDMARKER
stmt: simple_stmt | compound_stmt
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: import_stmt <in this case>
compound_stmt: if_stmt <in this case>
注意:simple_stmt
末尾有换行符。在if_stmt
之后,small_stmt
不能small_stmt
无法跟随另一个';'
。在compound_stmt
之后引入small_stmt
需要换行符。
这不是一个问题,因为bash
允许多行参数,只是不要关闭开头的单引号,直到你做完为止。
$ python -c '
> import re
> if 1:
> print(1)
> '
1
注意:>
由shell本身打印。它不是手工输入的。