【问题标题】:Python: kill process and close window it opened in (windows)Python:杀死进程并关闭它在(windows)中打开的窗口
【发布时间】:2015-09-25 16:37:05
【问题描述】:

我正在开发一种用于数据输入的工具,它基本上需要一个报告 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])

为了在 Adob​​e 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 的经验。如果我做错了什么,请告诉我!

提前致谢。

【问题讨论】:

  • 你试过 sys.exit(0) 吗?
  • 不,我没有——我想我误解了;我以为它也会退出主程序?我只想关闭作为主进程的子进程生成的窗口/进程。它会这样做吗?
  • 我想我误解了。您要关闭 Adob​​e Reader 进程吗?
  • 是的,对不起,如果我的帖子有点不清楚。我想结束进程关闭它所在的 adobe 阅读器窗口,同时让 python 程序(正在处理数据并打开报告)本身运行。
  • 你试过proc.terminate()了吗?

标签: python windows multiprocessing subprocess kill-process


【解决方案1】:

要杀死/终止子进程,请调用proc.kill()/proc.terminate()。它可能会使孙子进程继续运行,请参阅subprocess: deleting child processes in Windows

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

  1. Popen() 启动命令。它不会等待命令完成。有.wait()方法和方便函数如call()
  2. 即使Popen(command).wait()返回,即如果相应的外部进程已经退出;这并不一定意味着在一般情况下文档已关闭(启动器应用程序已完成,但主应用程序可能会持续存在)。

也就是说,第一步是删除不必要的multiprocessing.Process,并在主进程中调用Popen()

第二步是确保启动一个拥有已打开文档的可执行文件,即,如果它被杀死,则相应的文档将不会保持打开状态:AcroRd32.exe 可能已经是这样的程序(测试它:看看@987654333 @ 等待文档被关闭)或者它可能有一个命令行开关来启用这种行为。见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 只是我上面描述的一个启动器应用程序(它只是打开文档并立即退出而不等待文档关闭)。

【讨论】:

  • 感谢您的深入回复。你是对的,我之前的代码中的某些东西被挂断了。我删除了带有multiprocessing 的部分,并且只使用了Popen;我将其PID 保存为调用它的函数中的全局变量,并在该过程中使用subprocess 调用TASKKILL。它现在完全按照我的希望工作。谢谢!
  • @carusot42,您是否正在运行taskkill /t 来杀死子进程(至少可以找到子进程;Windows 不维护进程树,因此经常出现孤立进程)?否则为什么proc.kill() 不工作?在 Windows 上,存储 PID 以终止进程通常不是一个好主意。进程 ID 实际上只是系统句柄表中的进程句柄,因此 PID 可以重用。 Popen.kill 是安全的,因为它使用进程句柄。如果你需要taskkill /t,那么首先检查它是否还活着,即proc.poll() is None
猜你喜欢
  • 2015-08-30
  • 2021-07-24
  • 2015-08-09
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多