Python 在单行命令行中执行多行语句?
我正在使用Python和Python 在单行命令行中执行多行语句?,python,shell,command-line,heredoc,Python,Shell,Command Line,Heredoc,我正在使用Python和-c执行一个单行循环,即: $python-c”表示范围(10)内的r:打印“rob” 这个很好用。但是,如果在for循环之前导入模块,则会出现语法错误: $python-c“为范围(10)内的r导入系统:打印“rob” 文件“”,第1行 导入系统;对于范围(10)内的r:打印“rob” ^ SyntaxError:无效语法 你知道怎么解决这个问题吗 对我来说,将其作为一行代码非常重要,这样我就可以将其包含在Makefile中。只需使用return并在下一行键入它:
-c
执行一个单行循环,即:
$python-c”表示范围(10)内的r:打印“rob”
这个很好用。但是,如果在for循环之前导入模块,则会出现语法错误:
$python-c“为范围(10)内的r导入系统:打印“rob”
文件“”,第1行
导入系统;对于范围(10)内的r:打印“rob”
^
SyntaxError:无效语法
你知道怎么解决这个问题吗
对我来说,将其作为一行代码非常重要,这样我就可以将其包含在Makefile中。只需使用return并在下一行键入它:
user@host:~$ python -c "import sys
> for r in range(10): print 'rob'"
rob
rob
...
只需使用return并在下一行键入:
user@host:~$ python -c "import sys
> for r in range(10): print 'rob'"
rob
rob
...
你可以
echo -e "import sys\nfor r in range(10): print 'rob'" | python
或带出口管道:
python -c "exec(\"import sys\nfor r in range(10): print 'rob'\")"
python -c "exec(\"import sys \nfor r in range(10): print('rob') \")"
或
或者@/你可以这样做
echo -e "import sys\nfor r in range(10): print 'rob'" | python
或带出口管道:
python -c "exec(\"import sys\nfor r in range(10): print 'rob'\")"
python -c "exec(\"import sys \nfor r in range(10): print('rob') \")"
或
或者@/问题不在于
import
语句。问题是控制流语句不能在python命令中内联工作。将该import
语句替换为任何其他语句,您将看到相同的问题
想想看:python不可能将所有内容都内联。它使用缩进对控制流进行分组。问题不在于
import
语句。问题是控制流语句不能在python命令中内联工作。将该import
语句替换为任何其他语句,您将看到相同的问题
想想看:python不可能将所有内容都内联。它使用缩进来对控制流进行分组。问题实际上不是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执行不是更好的做法?问题实际上不是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执行不是更好吗?如果您的系统符合Posix.2,它应该提供printf
实用程序:
$ printf "print 'zap'\nfor r in range(3): print 'rob'" | python
zap
rob
rob
rob
如果您的系统符合Posix.2,则应提供
printf
实用程序:
$ printf "print 'zap'\nfor r in range(3): print 'rob'" | python
zap
rob
rob
rob
这种样式也可以在makefiles中使用(事实上,它经常被使用)
python-这种风格也可以在makefile中使用(事实上,它经常被使用)
python-(10年11月23日19:48回答)
我不是一个真正的大蟒蛇-但我发现了这个语法一次,忘了从哪里来的,所以我想我应该记录它:
如果您使用sys.stdout.write
而不是print
(区别在于,sys.stdout.write
将参数作为函数,放在括号中,而print
没有),那么对于一行程序,您可以将命令和的顺序颠倒过来,删除分号,并将命令括在方括号内,即:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
不知道在Python中如何调用此语法:)
希望这有帮助
干杯
(2013年4月9日星期二20:57:30编辑)好吧,我想我终于找到了一行中这些方括号的含义;它们是“列表理解”(显然);首先在Python 2.7中注意这一点:
$ STR=abc
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); print a"
<generator object <genexpr> at 0xb771461c>
如果我们现在使用方括号-请注意,我们不需要调用next()
来执行命令,它会在赋值时立即执行;但是,随后的检查显示a
为None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
对于方括号的情况,这并没有留下太多的信息可供查找-但我偶然发现了这一页,我认为它解释了:
:
如果您还记得,单行生成器的标准格式是一种括号内的单行“for”循环。这将产生一个“一次性”可重用对象,这是一个只能在一个方向上迭代的对象,一旦到达终点就不能重复使用
“列表理解”看起来几乎与常规的单行生成器相同,只是常规括号-()-被方括号-[]替换。理解力的主要优势在于产生一个“列表”,而不是一个“一次性”可编辑对象,这样你就可以在其中来回浏览、添加元素、排序等
事实上,它是一个列表——它只是它的第一个元素,一旦执行,它就变成无:
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin].__class__"
abc
<type 'list'>
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin][0]"
abc
None
注意,第二个“list”b
现在有两个元素,因为它的for循环显式运行了两次;然而,在这两种情况下,sys.stdout.write()
的结果(显然)都是None
(10年11月23日19:48回答)
我不是一个真正的大蟒蛇-但我发现这个语法一次,忘了从哪里来,所以我想我
cat somefile.log|python -c "import sys;[line for line in sys.stdin if sys.stdout.write(line*2)]"
python -c $'import sys\nfor r in range(10): print("rob")'
name='rob' # value to pass to the Python script
python -c $'import sys\nfor r in range(10): print(sys.argv[1])' "$name"
python -c "$(printf %b 'import sys\nfor r in range(10): print("rob")')"
python - <<<$'import sys\nfor r in range(10): print("rob")'
python - 'rob' <<<$'import sys\nfor r in range(10): print(sys.argv[1])'
printf %b 'import sys\nfor r in range(10): print("rob")' | python
printf %b 'import sys\nfor r in range(10): print(sys.argv[1])' | python - 'rob'
python -c "exec(\"import sys \nfor r in range(10): print('rob') \")"
python -c exec"""import sys \nfor r in range(10): print 'rob' """
python -c exec("""import sys \nfor r in range(10): print('rob') """)
python -c $'import sys \nfor r in range(10): print("rob")'
def py2cmdline(script):
exs = 'exec(%r)' % re.sub('\r\n|\r', '\n', script.rstrip())
print('python -c "%s"' % exs.replace('"', r'\"'))
>>> py2cmdline(getcliptext())
python -c "exec('print \'AA\tA\'\ntry:\n for i in 1, 2, 3:\n print i / 0\nexcept:\n print \"\"\"longer\nmessage\"\"\"')"
print 'AA A'
try:
for i in 1, 2, 3:
print i / 0
except:
print """longer
message"""
stmt: simple_stmt | compound_stmt
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
import_stmt | global_stmt | nonlocal_stmt | assert_stmt)
$ python - <<-"EOF"
import sys # 1 tab indent
for r in range(10): # 1 tab indent
print('rob') # 1 tab indent and 4 spaces
EOF
$ python - << "EOF"
import sys
for r in range(10):
print('rob')
EOF
$ python -c "
> import sys
> for p in '$PATH'.split(':'):
> print(p)
> "
/usr/sbin
/usr/bin
/sbin
/bin
...
$ python -c '
> import sys
> for p in "$PATH".split(":"):
> print(p)
> '
$PATH
$ python -c '
import sys
for p in "'"$PATH"'".split(":"):
print(p)
'
/usr/sbin
/usr/bin
/sbin
/bin
...
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
$ 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))"
grep special_string -r | sort | python3 <(cat <<EOF
import sys
for line in sys.stdin:
tokens = line.split()
if len(tokens) == 4:
print("%-45s %7.3f %s %s" % (tokens[0], float(tokens[1]), tokens[2], tokens[3]))
EOF
)
python -c """
import os
os.system('pwd')
os.system('ls -l')
print('Hello World!')
for _ in range(5):
print(_)
"""