Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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 使用&&;在subprocess.Popen中进行命令链接?_Python_Linux_Python 2.7_Popen_Chaining - Fatal编程技术网

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

Python 使用&&;在subprocess.Popen中进行命令链接?,python,linux,python-2.7,popen,chaining,Python,Linux,Python 2.7,Popen,Chaining,我将subprocess.Popen与Python一起使用,还没有找到一个通过Popen连接命令(即foobar&bizbang)的优雅解决方案 我可以这样做: p1 = subprocess.Popen(["mmls", "WinXP.E01"], stdout=subprocess.PIPE) result = p1.communicate()[0].split("\n") for line in result: scrip

我将
subprocess.Popen
Python
一起使用,还没有找到一个通过
Popen
连接命令(即foobar
&
bizbang)的优雅解决方案

我可以这样做:

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)

但这在美学上并不是很令人愉快(特别是如果我通过
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: -

有什么建议吗? 注意:我不想在subprocess.Popen中输入这个

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

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

如果您想使用shell功能,请在POpen调用中使用shell=True,但要注意它稍微慢一点/内存更密集一些

p1 = subprocess.Popen(["mmls", "WinXP.E01", "&&", "echo", "-e", "\"\n\"", "&&", "stat", "WinXP.E01"],
                      stdout=subprocess.PIPE, shell=True)
这个怎么样:

from subprocess import Popen, PIPE

def log_command_outputs(commands):
    processes = [Popen(cmd, stdout=PIPE) for cmd in commands]
    outputs = [proc.communicate()[0].split() for proc in processes]
    for output in outputs:
        for line in output:
            script_log.write(line)
        script_long.write("\n")
这将并行启动命令,这可能比逐个执行命令快一点(但幅度可能不大)。由于
communicate
调用是连续的,因此任何具有较大输出(超过管道缓冲区)的命令都将阻塞,直到轮到它被清理为止

对于您的示例命令链,您可以调用:

log_command_outputs([["mmls", "WinXP.E01"], ["stat", "WinXP.E01"]])

当你说“链接”时,你只是指按顺序运行进程,对吗?不要像管道一样将一个程序的输出传递给下一个程序的输入?如果是这样,那么应该很容易找到一个函数,该函数将运行一系列程序并返回一个字符串(或行列表)使用组合输出。只需创建一个循环!哪种更有利的解决方案不会太慢和/或占用大量内存?按照您在示例中给出的方式执行两个单独的命令,或将它们放置在一个循环中。警告!使用shell也会带来严重的安全风险。如果可能,请避免!&&“仅当p前一个命令成功。通常这样做是因为下一个命令取决于前一个命令的输出。在这种情况下,并行运行这些命令将无法正常工作。