Python失去了对子进程的控制?

jas*_*m76 13 python linux subprocess

我正在使用一个商业应用程序,它使用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. App.run()一个过程(从多处理)...不起作用

有什么想法会发生什么?

jfs*_*jfs 2

如果try: App.run() finally: cleanup()不起作用;您可以尝试在子进程中运行它:

import sys
from subprocess import call

rc = call([sys.executable, 'path/to/run_app.py'])
cleanup()
Run Code Online (Sandbox Code Playgroud)

或者,如果您的字符串中有代码,您可以使用-c选项,例如:

rc = call([sys.executable, '-c', '''import sys
print(sys.argv)
'''])
Run Code Online (Sandbox Code Playgroud)

preexec_fn=os.setsid您可以通过添加参数(注意: no )来使用 subprocess 来实现 @tMC 的建议 (),尽管我不知道创建进程组在这里有何帮助。或者您可以尝试shell=True在单独的 shell 中运行它。

您可以再次尝试多重处理:

import multiprocessing as mp

if __name__=="__main__":
   p = mp.Process(target=App.run)
   p.start()
   p.join()
   cleanup()
Run Code Online (Sandbox Code Playgroud)