在subprocess.Popen中使用&&进行命令链接?

5 python linux popen chaining python-2.7

我使用的是subprocess.PopenPython了,我还没有碰到过加盟命令的一流解决方案(即foob​​ar的到来&&通过bizbang) Popen

我可以这样做:

p1 = subprocess.Popen(["mmls", "WinXP.E01"], stdout=subprocess.PIPE)
result = p1.communicate()[0].split("\n")
for line in result:
    script_log.write(line)

script_log.write("\n")

p1 = subprocess.Popen(["stat", "WinXP.E01"], stdout=subprocess.PIPE)
result = p1.communicate()[0].split("\n")
for line in result:
    script_log.write(line)
Run Code Online (Sandbox Code Playgroud)

但这在美学上确实不是很令人满意(尤其是当我通过菊链多个命令时)Popen


我想在尽可能少的命令块中复制此输出。

not@work ~/ESI/lab3/images $ mmls WinXP.E01 && echo -e "\n" && stat WinXP.E01
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000000062   0000000063   Unallocated
02:  00:00   0000000063   0020948759   0020948697   NTFS (0x07)
03:  -----   0020948760   0020971519   0000022760   Unallocated


  File: `WinXP.E01'
  Size: 4665518381  Blocks: 9112368    IO Block: 4096   regular file
Device: 14h/20d Inode: 4195953     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    nott)   Gid: ( 1000/    nott)
Access: 2013-03-16 23:20:41.901326579 -0400
Modify: 2013-03-04 10:05:50.000000000 -0500
Change: 2013-03-13 00:25:33.254684050 -0400
 Birth: -
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

注意:我想避免将此输入 subprocess.Popen

p1 = subprocess.Popen(["mmls WinXP.E01 && echo -e '\n' && stat WinXP.E01"], stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 5

&&是shell运算符,默认情况下POpen不使用shell。

如果要使用外壳程序功能,请在POpen调用中使用shell = True,但请注意,它稍微慢一些/占用更多内存。

p1 = subprocess.Popen(["mmls", "WinXP.E01", "&&", "echo", "-e", "\"\n\"", "&&", "stat", "WinXP.E01"],
                      stdout=subprocess.PIPE, shell=True)
Run Code Online (Sandbox Code Playgroud)

  • 警告!使用 shell 也是一个重大的安全风险。尽可能避免![链接](/sf/ask/222072931/) (2认同)