小编典典

在单行命令行中执行多行语句

all

我正在使用 Python-c来执行单行循环,即:

python -c "for r in range(10): print 'rob'"

这工作正常。 但是,如果我在for 循环之前导入模块,则会出现语法错误:

python -c "import sys; for r in range(10): print 'rob'"

  File "<string>", line 1
    import sys; for r in range(10): print 'rob'
              ^
SyntaxError: invalid syntax

如何解决这个问题?

对我来说,将它作为一个单行线很重要,这样我就可以将它包含在Makefile中。


阅读 66

收藏
2022-05-29

共1个答案

小编典典

你可以做

echo -e "import sys\nfor r in range(10): print 'rob'" | python

或者没有管道:

python -c "exec(\"import sys\nfor r in range(10): print 'rob'\")"

或者

(echo "import sys" ; echo "for r in range(10): print 'rob'") | python

或SilentGhost 的回答

只需使用Return并在下一行输入:

python -c "import sys
for r in range(10): print 'rob'"

rob
rob
...

或Crast的回答。

问题实际上不在于import语句。它与for循环之前的任何内容有关。或者更具体地说,内联块之前出现的任何内容。

例如,这些都有效:

python -c "import sys; print 'rob'"
python -c "import sys; sys.stdout.write('rob\n')"

如果 import 是一个语句是一个问题,这会起作用,但它不会:

python -c "__import__('sys'); for r in range(10): print 'rob'"

对于您非常基本的示例,您可以将其重写为:

python -c "import sys; map(lambda x: sys.stdout.write('rob%d\n' % x), range(10))"

但是,lambdas 只能执行表达式,不能执行语句或多条语句,所以你可能仍然无法做你想做的事情。然而,在生成器表达式、列表推导、lambdas、sys.stdout.write、内置“map”和一些创造性的字符串插值之间,你可以做一些强大的单行。

问题是,你想走多远,在什么时候写一个.py你的makefile执行的小文件不是更好?

2022-05-29