Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在单行命令行中执行多行语句?_Python_Shell_Command Line_Heredoc - Fatal编程技术网

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并在下一行键入它:

我正在使用Python和
-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
...
你可以

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语句,而是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

这种样式也可以在makefiles中使用(事实上,它经常被使用)

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

单引号/双引号
反斜杠
无处不在:

$ python -c 'exec("import sys\nfor i in range(10): print \"bob\"")'
更好的是:

$ python -c '
> import sys
> for i in range(10):
>   print "bob"
> '
$python2.6-c“导入sys;[sys.stdout.write('rob\n'),用于范围(10)内的r)]”

很好。
使用“[]”内联for循环。

此脚本提供类似Perl的命令行界面:


如果您不想触摸stdin并像传递了“python cmdfile.py”一样进行模拟,您可以在bash shell中执行以下操作:

$ python  <(printf "word=raw_input('Enter word: ')\nimport sys\nfor i in range(5):\n    print(word)")

$python当我需要这样做时,我使用

python -c "$(echo -e "import sys\nsys.stdout.write('Hello World!\\\n')")"

请注意sys.stdout.write语句中的换行符有三个反斜杠。

还有一个选项,sys.stdout.write返回None,它使列表保持为空

cat somefile.log | python-c“导入sys;[sys.stdin中的行对行,如果sys.stdout.write(行*2)]”
-为了使这个答案同样适用于Python3.x,
print
被作为函数调用:在3.x中,只有
print('foo')
起作用,而2.x也接受
print'foo'

-有关包含Windows的跨平台透视图,请参见

bash
ksh
zsh
中:

使用
$“…”
),它允许使用
\n
表示在字符串传递到
python
之前展开为实际换行的换行:

python -c $'import sys\nfor r in range(10): print("rob")'
注意
语句的
导入
和之间的\n,以实现换行

要将shell变量值传递给这样的命令,最安全的方法是使用参数并通过Python脚本中的
sys.argv
访问它们:

name='rob' # value to pass to the Python script
python -c $'import sys\nfor r in range(10): print(sys.argv[1])' "$name"
请参见下文,以了解对
$ python  <(printf "word=raw_input('Enter word: ')\nimport sys\nfor i in range(5):\n    print(word)")
python -c "$(echo -e "import sys\nsys.stdout.write('Hello World!\\\n')")"
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(_)
"""