Как запустить функцию, когда подпроцесс завершен? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть 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 голосов
/ 15 мая 2018

Когда вы говорите, что «завершаете» sub.py, значит ли это, что вы нажимаете Ctrl + C на нем? В Windows это фактически отправляет CTRL_C_EVENT процессу, в отличие от terminate() метода, который вызывает TerminateProcess метод WinAPI.

Похоже, вам нужно import signal, а затем сделать proc.send_signal(signal.CTRL_C_EVENT) вместо proc.terminate()

...