jas*_*m76 13 python linux subprocess
我正在使用一个商业应用程序,它使用Python作为其脚本API的一部分.提供的功能之一是所谓的App.run().调用此函数时,它会启动一个执行其余执行的新Java进程.(不幸的是,由于提供的Python模块是.pyc文件,我真的不知道它在幕后做了什么,而且许多Python函数都是SWIG生成的).
我遇到的麻烦是我正在将App.run()调用构建到一个更大的Python应用程序中,该应用程序需要做一些有保证的清理代码(关闭数据库等).不幸的是,如果子进程被Ctrl+ 中断C,它将中止并返回到命令行而不将控制权返回给主Python程序.因此,我的清理代码永远不会执行.
到目前为止,我已经尝试过:
__del__析构函数中......不起作用.(App.run()在课堂内)App.run()一个主题...结果后的内存故障Ctrl+CApp.run()一个过程(从多处理)...不起作用有什么想法会发生什么?
如果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)