gpt4 book ai didi

Python 失去对子进程的控制?

转载 作者:IT王子 更新时间:2023-10-29 00:27:49 25 4
gpt4 key购买 nike

我正在使用一个商业应用程序,它使用 Python 作为其脚本 API 的一部分。提供的功能之一是名为 App.run() 的功能。调用此函数时,它会启动一个新的 Java 进程来完成其余的执行。 (不幸的是,我真的不知道它在做什么,因为提供的 Python 模块是 .pyc 文件,并且许多 Python 函数都是 SWIG 生成的)。

我遇到的问题是我正在将 App.run() 调用构建到一个更大的 Python 应用程序中,该应用程序需要执行一些有保证的清理代码(关闭数据库等) .不幸的是,如果子进程被 Ctrl+C 中断,它会中止并返回到命令行,而不会将控制权返回给主 Python 程序。因此,我的清理代码永远不会执行。

到目前为止我已经尝试过:

  1. 使用 atexit 注册函数...不起作用
  2. 将清理放在类 __del__ 的析构函数中...不起作用。 (App.run() 在类内)
  3. 在主 Python 应用程序中为 Ctrl+C 创建信号处理程序...不起作用
  4. App.run() 放入一个线程...在 Ctrl+C
  5. 后导致内存错误
  6. App.run() 放入进程中(来自多处理)...不起作用

知道会发生什么吗?

最佳答案

这只是一个大纲 - 但像这样的东西?

import os

cpid = os.fork()
if not cpid:
# change stdio handles etc
os.setsid() # Probably not needed
App.run()
os._exit(0)

os.waitpid(cpid)
# clean up here

(os.fork 仅适用于 *nix)

同样的想法可以通过 subprocess 以操作系统不可知的方式实现。思路是在子进程中运行App.run(),然后等待子进程退出;不 pipe 进程是如何死亡的。在 posix 上,您还可以捕获 SIGCHLD(子进程死亡)。我不是 Windows 大师,所以如果适用并且 subprocess 不起作用,其他人将不得不在这里插话。

App.run() 被调用后,我很好奇进程树是什么样子的。它有可能运行 exec 并接管 python 进程空间。如果发生这种情况,创建子进程是我能想到的捕获它的唯一方法。

关于Python 失去对子进程的控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12940628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com