如何在子进程终止时运行函数?

时间:2018-05-15 02:10:13

标签: python subprocess atexit

我有2个python代码,其中一个是mar.py,另一个是sub.py

## mar.py
import os
import subprocess
import time

print('MASTER PID: ', os.getpid())

proc = subprocess.Popen(["D:\Miniconda3\python.exe", r"C:\Users\J\Desktop\test\sub.py"], shell=False)

def terminator():
    proc.terminate()

time.sleep(5)
terminator()

mar.py只需使用sub.py创建子流程,并在5秒后终止。

## sub.py
import atexit
import time
import os

print('SUB PID: ', os.getpid())

os.chdir("C:\\Users\\J\\Desktop\\test")

def handle_exit():
    with open("foo.txt", "w") as f:
        f.write("Life is too short, you need python")

atexit.register(handle_exit)

while True:
    print('alive')
    time.sleep(1)

我认为在foo.txt的子进程终止之前会创建sub.py,但没有任何反应。如果我自己运行sub.py并终止它,它会按照我的计划创建foo.txt。是什么让这个与众不同,即使它作为子流程运行,我仍然可以创建foo.txt

我正在使用Windows 10(64位)和Python 3.6.5(32位)

1 个答案:

答案 0 :(得分:2)

当你说“终止”sub.py时,这是否意味着你按下Ctrl + C?在Windows上,这实际上会向进程发送CTRL_C_EVENT,这与调用terminate() WinAPI方法的TerminateProcess方法不同。

您需要import signal,然后proc.send_signal(signal.CTRL_C_EVENT)代替proc.terminate()