在将程序作为字符串传递给Python时使用导入和for循环

8 投票
4 回答
1344 浏览
提问于 2025-04-18 16:36

最近,一个同事给我发了一段包含内联Python的bash脚本。他使用的命令大致是这样的:

$ echo -e 'from foo import bar\nfor i in range(10):\n   bar(i+1).thing = "something"\n\n' | python

这个命令运行得很好,但我问他为什么不使用 python -c。经过进一步调查,我们发现无法将这个命令转换成 python -c 能接受的格式,因为Python不允许在for循环之前有语句,即使用分号分隔也不行。

下面的第一个例子显示了你可以导入一个对象,并打印出这个导入的对象。第二个例子展示了你可以使用for循环并从中打印内容。第三个例子将前两个结合起来,结果出现了一个 SyntaxError。最后,第四个例子展示了在for循环之前使用表达式时会导致 SyntaxError 的结果:

$ python -c "from sys import argv; print argv"
['-c']
$ python -c "for v in [1,2,3,4]: print v"
1
2
3
4
$ python -c "from sys import argv; for v in argv: print v"
  File "<string>", line 1
    from sys import argv; for v in argv: print v
                            ^
SyntaxError: invalid syntax
$ python -c "x = 5; for i in [1,2,3]: print i"
  File "<string>", line 1
    x = 5; for i in [1,2,3]: print i
         ^
SyntaxError: invalid syntax

回头看,出现 SyntaxError 其实并不奇怪,因为当代码保存为脚本时,它是不合法的,而且语句的语法和空格限制会导致这种限制。不过,是否有办法通过 python -c 允许在复合语句之前有一个语句呢?

4 个回答

3

你已经得到了关于 -c 的答案,但对于你的情况,使用 here document 有个好处,就是它不会像用 -c 参数时那样出现字符串引号的问题。因为你可以使用任何你想要的独特分隔符,只要这个分隔符在你的脚本中不会出现就行。

python <<'PYSCRIPT'
for i in range(10):
    print(i)
PYSCRIPT

(如果你 想让 shell 变量扩展,就在初始分隔符周围加单引号;如果你 让它扩展,就不加引号。)

3

根据文档(强调部分),试着用换行符来代替分号。

当使用 -c 命令调用时,它会执行作为命令给出的 Python 语句。在这里,命令可以包含多个语句,这些语句之间用换行符分隔。在 Python 语句中,前面的空格是很重要的哦!

4

还有一个选择:

python -c "exec(\"x = 5\nfor i in [1,2,3]:\n\tprint(i)\")"

编辑:

经过测试,适用于Windows的命令提示符和Bash。

9

为了更清楚地解释CDspace的回答,注意在Bash中,与Python不同的是,换行符并不会结束字符串。所以你可以这样做:

$python -c 'import sys
for i in range(10):
  print(i)

'

撰写回答