2016-08-11 8 views
0

Я использую C++, Python 3.5 и Windows 7. В настоящее время я вызываю исполняемый файл C++ из моего кода Python с помощью подпроцесса, а затем завершая исполняемый файл, используя следующий код:Функция вызова C++ при завершении из подпроцесса Python

open = Popen([path\to\exe]) 
open.terminate() 

Это кажется маловероятным, но возможно ли, чтобы мой код на C++ вызывал функцию сам по себе, когда на нем заканчиваются вызовы Python? Я нашел опции для функций, вызываемых при закрытии C++ с помощью кнопки X или отдельно, но этот вопрос слишком специфичен.

ответ

0

Чтобы иметь возможность завершить свой C++ код, который вы должны сначала сделать такие вещи, как

p = subprocess.Popen(["path\to\exe"]) 
#... do stuff 
#and when you want to terminate it 
p.terminate() 

Но вы не можете назвать Popen снова, потому что будет порождать еще один экземпляр, который бы убил бы сразу: бесполезно.

Когда вы завершаете процесс, он останавливает его прямо там, как kill -9 или taskkill /F. Если вы хотите, чтобы дать шанс процессу среагировать, сделать это только вместо p.terminate()

Окна:

os.system("taskkill /PID "+str(p.pid)) 

Unix & для Windows (только что прочитал в документации, но не проверял):

os.kill(p.pid,signal.CTRL_BREAK_EVENT) 

(опуская /F флаг позволяет ставить ручку в C++ программу, чтобы выполнить некоторую процедуру выхода/очистки, а затем выйти)

Edit: поставить ручку в программе C++ (atexit просто вызывается при вызове явно exit, не работает в этом случае):

(источник: How can I catch a ctrl-c event? (C++))

+0

Спасибо так много! В таком случае, смогу ли я использовать std :: atexit для вызова функции при закрытии? Если нет, как я могу заставить свой код реагировать на убийство? – OCW