我有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位)
答案 0 :(得分:2)
当你说“终止”sub.py时,这是否意味着你按下Ctrl + C?在Windows上,这实际上会向进程发送CTRL_C_EVENT
,这与调用terminate()
WinAPI方法的TerminateProcess
方法不同。
您需要import signal
,然后proc.send_signal(signal.CTRL_C_EVENT)
代替proc.terminate()