如何仅在上一个关闭后才启动进程

时间:2019-07-18 09:54:53

标签: python subprocess winmerge

我正在尝试使用Winmerge将一个文件夹中的文件列表与另一个文件夹中的文件进行比较。 我希望在Winmerge中打开第一个比较,并在其关闭时打开第二个比较,依此类推,直到没有更多要比较的文件。

我尝试对所有文件循环调用subprocess.Popen(),但这会启动多个Winmerge窗口。

for file in file_list:
    get_comparison = subprocess.Popen('WinmergeU.exe ' +'D:\database_1\'+file +'D:\database_2\'+file, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

我希望一次只运行一个Winmerge进程

2 个答案:

答案 0 :(得分:0)

您可以使用Popen.wait()方法来等待进程结束。或者只使用subprocess.runsubprocess.getstatusoutputgetoutput等。

import subprocess

if __name__ == '__main__':
    p = subprocess.Popen('echo 1', stdout=subprocess.PIPE)
    code = p.wait()
    print('first task finished', code)

    p = subprocess.run('echo 2', stdout=subprocess.PIPE)
    print('second task finished', p.returncode, p.stdout.decode())

    code, output = subprocess.getstatusoutput('echo 3')
    print('third task finished', code, output)

输出:

first task finished 0
second task finished 0 2
third task finished 0 3

答案 1 :(得分:0)

subprocess.Popen()不会阻塞,它只会创建进程,即程序不会在生成新进程之前等待每个进程完成。我不确定您使用的是哪个版本的Python,但是:

  • 如果您使用的是Python 3.7.X ,请改用subprocess.run()
  • 如果您使用的是Python 2.7.X ,请改用subprocess.call()

这些方法会阻止并等待每个进程完成,然后再开始下一个进程。乍一看并不明显,但是您应该在subprocess documentation中找到它。