2013-07-27 3 views
1

У меня есть программа, которая требует некоторой очистки после выхода и написала для этого отдельный файл .py. Тем не менее, программа, которую я использовать оттяжки в бесконечном цикле на одной части:Как открыть другую программу после выхода из программы на Python?

pythoncom.PumpMessages() 

Из-за этого, нет никакого «естественного» закрытие программы. Единственный способ - завершить процесс из диспетчера задач.

Итак, я спрашиваю: есть ли способ, после того, как он закончился из диспетчера задач, запустить автоматический сценарий python?

Edit: я мог бы поставить его в бесконечный цикл по-другому, например, как это, если это помогает:

while True: 
    pythoncom.PumpWaitingMessages() 
+0

проверить эту http://stackoverflow.com/questions/6023172/ending-a-program-mid-run – nio

ответ

1

В Unix, когда вы убить процесс, вы посылаете ему сигнал , Например, CTRL-C вызывает сигнал, отправленный в программу.

В окнах некоторые из этих сигналов эмулируются, включая CTRL-C. Если ваш цикл не вызывает функции, которые блокируют сигнал CTRL-C, вы можете нажать CTRL-C, чтобы убить цикл. Не могли бы вы попытаться завершить свою программу с помощью CTRL-C вместо того, чтобы делать это через диспетчер задач?

Если это так, вы можете написать обработчик, чтобы поймать сигнал CTRL-C, очистить состояние программы и sys.exit().

Вот код для захвата сигнала: How do I capture SIGINT in Python?

+0

CTRL-C посылает SIGINT в питон скрипт – eri

+0

@eri, Да, и есть ссылка на «Как захватить SIGINT в Python». – Jonathan

3

Существует пример из моего проекта:

import signal 

def term(*args,**kwargs): 
    sys.stderr.write('\nStopping...') 
    do_cleaning_stuff_here() 

signal.signal(signal.SIGTERM, term) 
signal.signal(signal.SIGINT, term) 
signal.signal(signal.SIGQUIT, term) 
yuor_main_code_here() 

С бесконечным циклом:

import signal 

def term(*args,**kwargs): 
    global running 
    sys.stderr.write('\nStopping...') 
    running=False 

signal.signal(signal.SIGTERM, term) 
signal.signal(signal.SIGINT, term) 
signal.signal(signal.SIGQUIT, term) 
running=True 
while running: 
    handle() 
cleanup() 

окно сигналы, переведенные на UNIX'овый эквивалент.

3

Вы можете запустить оба сценария из отдельного сценария python и убить первый процесс перед запуском второго.

Например, используя subprocess.Popen:

proc1 = subprocess.Popen(cmd, shell = True) 
time.sleep(waititme) #or other flag, such as reading another source 
proc1.kill() 
proc2 = subprocess.Popen(cmd2, shell = True) 
Смежные вопросы