子进程终止时如何运行一个函数?
How to run a function when a subprocess is terminated?
我有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 位)
当您说 "terminate" sub.py 时,这是否意味着您按下了 Ctrl+C?在 windows 上,这实际上将 CTRL_C_EVENT
发送到进程,这与调用 TerminateProcess
WinAPI 方法的 terminate()
方法不同。
看起来您需要 import signal
然后执行 proc.send_signal(signal.CTRL_C_EVENT)
而不是 proc.terminate()
我有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 位)
当您说 "terminate" sub.py 时,这是否意味着您按下了 Ctrl+C?在 windows 上,这实际上将 CTRL_C_EVENT
发送到进程,这与调用 TerminateProcess
WinAPI 方法的 terminate()
方法不同。
看起来您需要 import signal
然后执行 proc.send_signal(signal.CTRL_C_EVENT)
而不是 proc.terminate()