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

Python 子进程终止时如何运行函数?,python,subprocess,atexit,Python,Subprocess,Atexit,我有两个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

我有两个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位)

当你说你“终止”sub.py时,这是否意味着你按下了Ctrl+C键?在windows上,这实际上会将
CTRL\u C\u事件
发送到进程,而不像
terminate()
方法调用
TerminateProcess
WinAPI方法


看起来您需要导入信号,然后执行过程发送信号(signal.CTRL\u C\u事件)而不是过程终止()

是的,我按了CTRL+C。非常感谢你的回答!现在可以了!