你知道怎么解决吗?
你的问题是由这样一个事实造成的:Python语句,用;分隔,只允许是“小语句”,它们都是一行程序。来自Python文档中的语法文件:
标准时间: simple_stmt |compound_stmt
simple_stmt: small_stmt (“;”small_stmt)* [“;”]换行符
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
import_stmt |global_stmt |nonlocal_stmt |assert_stmt)
复合语句不能通过分号与其他语句包含在同一行中——因此使用-c标志来做到这一点非常不方便。
在bash shell环境中演示Python时,我发现包含复合语句非常有用。唯一可靠的简单方法是使用heredocs (posix shell的东西)。
赫里多克斯
使用heredoc(使用<<创建)和Python的命令行接口选项,-:
$ python - <<-"EOF"
import sys # 1 tab indent
for r in range(10): # 1 tab indent
print('rob') # 1 tab indent and 4 spaces
EOF
在<<之后添加-(<<-)允许您使用制表符缩进(Stackoverflow将制表符转换为空格,因此我缩进了8个空格以强调这一点)。前面的制表符将被剥离。
你可以在没有标签的情况下使用<<:
$ python - << "EOF"
import sys
for r in range(10):
print('rob')
EOF
在EOF周围加上引号可以防止参数和算术扩展。这使得heredoc更加健壮。
Bash多行字符串
如果你使用双引号,你会得到shell- expand:
$ python -c "
> import sys
> for p in '$PATH'.split(':'):
> print(p)
> "
/usr/sbin
/usr/bin
/sbin
/bin
...
为了避免shell扩展,请使用单引号:
$ python -c '
> import sys
> for p in "$PATH".split(":"):
> print(p)
> '
$PATH
注意,我们需要在Python中对字面量交换引号字符-我们基本上不能使用由BASH解释的引号字符。我们可以交替使用它们,就像在Python中一样——但这看起来已经很混乱了,这就是为什么我不建议这样做:
$ python -c '
import sys
for p in "'"$PATH"'".split(":"):
print(p)
'
/usr/sbin
/usr/bin
/sbin
/bin
...
对已接受答案(和其他答案)的批评
这不是很好读:
Echo -e "import sys\nfor rin range(10): print 'rob'" | python
可读性不强,而且在出现错误的情况下很难调试:
Python -c "exec(\"import sys\\nfor rin range(10): print 'rob'\")"
也许可读性更强一些,但仍然很难看:
(echo "import sys";Echo "for rin range(10): print 'rob'") | python
如果你的python里有",你就会过得很糟糕:
$ python -c "import sys .
> for rin range(10): print 'rob'"
不要滥用map或list推导式来获取for循环:
import sys;Map (lambda x: sys.stdout。Write ('rob%d\n' % x), range(10))"
这些都是悲伤而糟糕的。不要这样做。