在一行命令行中执行多行语句?

2024-05-14 14:40:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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中。


Tags: 模块inimportforstringsyslinerange
3条回答

你可以的

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's answer/@Crast's answer

问题不在于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执行?

这种样式也可以在makefile中使用(事实上它经常使用)。

python - <<EOF
import sys
for r in range(3): print 'rob'
EOF

或者

python - <<-EOF
    import sys
    for r in range(3): print 'rob'
EOF

在后一种情况下,前面的制表符也会被删除(并且可以实现一些结构化的外观)

而不是EOF可以在一行的开头放置任何没有出现在here文档中的标记词(另请参见bash手册页中的here文档或here)。

相关问题 更多 >

    热门问题