在将程序作为字符串传递给Python时使用导入和for循环
最近,一个同事给我发了一段包含内联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 个回答
你已经得到了关于 -c
的答案,但对于你的情况,使用 here document 有个好处,就是它不会像用 -c
参数时那样出现字符串引号的问题。因为你可以使用任何你想要的独特分隔符,只要这个分隔符在你的脚本中不会出现就行。
python <<'PYSCRIPT'
for i in range(10):
print(i)
PYSCRIPT
(如果你 不 想让 shell 变量扩展,就在初始分隔符周围加单引号;如果你 想 让它扩展,就不加引号。)
根据文档(强调部分),试着用换行符来代替分号。
当使用 -c 命令调用时,它会执行作为命令给出的 Python 语句。在这里,命令可以包含多个语句,这些语句之间用换行符分隔。在 Python 语句中,前面的空格是很重要的哦!
还有一个选择:
python -c "exec(\"x = 5\nfor i in [1,2,3]:\n\tprint(i)\")"
编辑:
经过测试,适用于Windows的命令提示符和Bash。
为了更清楚地解释CDspace的回答,注意在Bash中,与Python不同的是,换行符并不会结束字符串。所以你可以这样做:
$python -c 'import sys
for i in range(10):
print(i)
'