if语句和命令行中的一行python脚本

时间:2014-04-25 18:35:45

标签: 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

以下代码可以正常使用

python -c 'if True: print "HELLO";'

如何从命令行更改我的一行以在一行上执行我想要的脚本?

4 个答案:

答案 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 reif 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本身打印。它不是手工输入的。