Python:杀死进程并关闭它打开的窗口(windows)

时间:2015-09-25 16:37:05

标签: python windows multiprocessing subprocess kill-process

我正在为我的工作中的数据输入工具工作,它基本上需要一个报告ID号,打开PDF到该报告的那个页面,允许您输入信息然后保存。

我对在python中实例化新进程完全不熟悉;这是我第一次尝试这样做。所以基本上,我有一个相关的功能:

def get_report(id):
    path = report_path(id)
    if not path:
        raise NameError
    page = get_page(path, id)
    proc = subprocess.Popen(["C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe", "/A", "page={}".format(page),
                             path])

为了在Adobe Acrobat中打开报告并且能够在报告仍处于打开状态时输入信息,我确定我必须使用multiprocessing。因此,在程序的主循环中,它迭代数据并获取报告ID,我有这个:

for row in rows:
    print 'Opening report for {}'.format(ID)
    arg = ID
    proc = Process(target=get_report, args=(arg,))
    proc.start()

    row[1] = raw_input('Enter the desired value: ')
    rows.updateRow(row)

    while proc.is_alive():
        pass

这样,可以在subprocess.Popen()命令没有挂起程序的情况下输入数据。但是,如果它只是继续到下一个记录而不关闭弹出的Acrobat窗口,那么它实际上不会打开下一个报告。因此while proc.is_alive():,因为它给了一个手动关闭窗口的机会。我喜欢在点击'enter'并输入值后立即终止进程,因此它会继续,只需更少的工作就可以打开下一个报告。我尝试了几种不同的方法,使用pid通过os.kill()杀死进程的方法;我尝试杀死子进程,杀死进程本身,杀死它们,并尝试使用subprocess.call()而不是Popen()来查看它是否有所作为。

没有。

我在这里缺少什么?如何终止进程关闭它打开的窗口?这甚至可能吗?就像我说的,我对python中的进程只有0次经验。如果我做错了什么,请告诉我!

提前致谢。

1 个答案:

答案 0 :(得分:3)

要终止/终止子流程,请致电proc.kill() / proc.terminate()。它可能会让孙子进程运行,请参阅subprocess: deleting child processes in Windows

  

这样,可以在subprocess.Popen()命令中挂起程序的情况下输入数据。

  1. Popen()启动命令。它不等待命令完成。有.wait()方法和便利功能,例如call()
  2. 即使Popen(command).wait()返回,即相应的外部进程已退出;它并不一定意味着文档在一般情况下已关闭(启动器应用程序已完成但主应用程序可能仍然存在)。
  3. 即,第一步是删除不必要的multiprocessing.Process并在主流程中调用Popen()

    第二步是确保启动一个拥有已打开文档的可执行文件,即,如果它被杀死,相应的文档将不会保持打开状态:AcroRd32.exe可能已经是这样的程序(测试它:查看call([r'..\AcroRd32.exe', ..])是否等待文档被关闭),或者它可能有一个启用此类行为的命令行开关。见How do I launch a file in its default program, and then close it when the script finishes?

      

    我尝试杀死子进程,杀死进程本身,杀死它们,并尝试使用subprocess.call()而不是Popen()来查看它是否有所不同。
      它没有。

    如果kill()Popen()在您的情况下表现相同,那么您要么犯了错误(他们的行为不一样:您应该create a minimal standalone code example with a dummy pdf that demonstrates the problem。使用文字描述:您期望发生什么(一步一步)以及发生的事情)或AcroRd32.exe只是我上面描述的一个启动器应用程序(它只是打开文档并立即退出而无需等待要关闭文件。)