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

How to start a process only after the previous one is closed

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

我已经尝试在所有文件的循环中调用 subprocess.Popen(),但这会启动多个 Winmerge windows。

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 一次只有一个进程 运行

您可以使用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

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

  • 如果您在 Python 3.7.X 工作,请改用 subprocess.run()
  • 如果您在 Python 2.7.X 工作,请改用 subprocess.call()

这些方法确实会阻塞并等待每个进程完成,然后再开始下一个进程。起初并不明显,但你应该在 subprocess documentation.

中找到它