Python多行命令从Bash中运行

8

我正在尝试运行这个:

python -c "for i in range(10):\n  print i"

但是我遇到了一个错误:
File "<string>", line 1
for i in range(10):\n  print i
                             ^
SyntaxError: unexpected character after line continuation character

根据this,我认为bash应该处理(即换行符)命令行参数,但返回的错误显示相反的情况。我错在哪里,这是为什么呢?
附注:python-2.7
编辑
让我稍微解释一下我的动机。 这个代码示例肯定很愚蠢。由于文档中说“command可以是一个或多个语句,用换行符分隔,具有与普通模块代码相同的重要前导空格”,我想知道如何正确地将那些提到的换行符带到command中。 这里提出的解决方案是:
  1. 在循环内使用 ; 来区分多个命令。是的,这样可以工作,但它仍然是一条 单行 命令,如果我想要在循环之后运行一些命令,则无法使用它。 ; 不能替换换行符。

  2. 在需要换行符的位置输入 ^M。这更准确地达到了目标,但不幸的是,从我的角度来看,这基本上破坏了从命令行运行Python代码的整个想法,因为它需要交互模式。就我所知,这与输入命令并击键 Enter 是相同的。因此,与输入 python 并在其 shell 中工作没有区别。也就是说,我不能在 bash 脚本中编写此内容。或者我可以吗?

可能这个问题真的应该分成两个问题:

  1. Bash转义:

    用双引号(“”)将字符括起来可以保留引号内所有字符的字面值,但是'$'、''、'\'以及启用历史扩展时的'!'除外。在双引号内,'$'和''保留它们的特殊含义(请参见Shell扩展)。只有在反斜杠后跟以下字符之一时,反斜杠才保留其特殊含义:'$'、'`'、'"'、'\'或换行符。

这与所描述的情况相对应吗?Bash如何处理换行符?我发现将命令放入一元引号中没有任何变化。

  1. 如何以非交互方式向Python传递换行符。(你可能会说——为什么不写一个普通的Python文件,其中包含所有想要的换行符——你是对的,但我对文档中确切的意思很感兴趣,因为它引用了换行符)

你正在运行哪个版本的Python? - DanHabib
3个回答

6
您实际上需要将\n部分转换为实际的换行符。这可以使用$''语法完成:
python -c $'for i in range(10):\n  print i'
0
1
2
3
4
5
6
7
8
9

您也可以使用echo -eprintf来达到这个结果。

$ python -c "$(echo -e "for i in range(10):\n  print i")"

您也可以使用一个 here 字符串:
$ python <<< $(echo -e "for i in range(10):\n  print i")

请参阅Bash手册的3.1.2.4 ANSI-C Quoting章节获取更多信息。


4

删除 \n

python -c "for i in range(10):  print i"

或者

你可以在for循环中使用;来使用多行

python -c "for i in range(10): print '1st newline';print '2nd newline';print i"

2
这肯定不是答案。您的建议将使命令成为一行代码。 - DimG
为什么你在使用新行? - Kalanidhi
1
这只是一个轻量级的工作示例,模拟了问题,实际代码有点更复杂,需要多行。 - DimG
在for循环中,您可以使用;来使用多行。 - Kalanidhi

1

如果您在代码行中添加回车符,就可以运行多行的 python -c 语句:

python -c "for i in range(10):^M print (i)^M print ('Hello:' + str(i*i))" 

where ^M 实际上不是 M 后面跟着的 ^,而是在输入 [CTRL-v][CTRL-m] 后得到的字符。请注意该字符后面的空格,这意味着 for 循环中有两个 print 语句,并且应该打印:

0
Hello:0
1
Hello:1
....
9
Hello:81

您也可以在bash脚本中执行此操作:

#!/bin/bash
A="python -c \"for i in range(10):^M print (i)^M print ('Hello:' + str(i*i))\""
eval $A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接