2015-06-15 2 views
0

Я работаю на Widnows 7 (32 бита), и это мой код:Python открытым и убить подпроцесс

def start_mviewer_broker(broker_path, test_name): 
""" The function starts the broker server""" 
try: 
    print("**** start_mviewer_broker ****") 
    p = subprocess.Popen('start python ' + broker_path + ' ' + test_name, shell=True) 
    return p 
except: 
    print("**** start_mviewer_broker - EXCEPTION ****") 
    return 0 


def kill_process(p): 
""" The function kills the input running process""" 
try: 
    print("**** kill_process ****") 
    p.terminate() 
except: 
    print("**** kill_process - EXCEPTION ****") 
    pass 

У меня есть несколько проблем. Единственным способом запуска моего подпроцесса является опция shell = True. Если я изменю этот параметр на False, подпроцесс не будет запущен.

Другая проблема заключается в том, что процесс убийства не убивает мой процесс, но не исключение.

Любая идея?

+3

'start' - это не исполняемый файл, а команда cmd, поэтому вам всегда нужно использовать' shell = True' при его использовании. Возвращенный процесс - это не процесс python, а оболочка, используемая для создания его, поэтому его убийство не будет иметь нужного эффекта. Не используйте 'start'. – mata

+0

Хорошо! Большое спасибо. Теперь, без запуска, все работает так, как я хочу. –

ответ

0

Вы хотели бы изменить свой код на следующее:

def start_mviewer_broker(broker_path, test_name): 
""" The function starts the broker server""" 
try: 
    print("**** start_mviewer_broker ****") 
    return subprocess.Popen('python ' + broker_path + ' ' + test_name) # Note changed line here 
except: 
    print("**** start_mviewer_broker - EXCEPTION ****") 
    return 0 


def kill_process(p): 
""" The function kills the input running process""" 
try: 
    print("**** kill_process ****") 
    p.terminate() 
except: 
    print("**** kill_process - EXCEPTION ****") 
    pass 

start часть, которую вы работаете не нужно. Фактически, это не исполняемый файл, а команда cmd. Следовательно, для запуска требуется оболочка. Вот почему он не работал только с shell=False. Однако, удалив его, вы можете использовать shell=False. Затем вы выполняете процесс python как возвращенный процесс вместо оболочки, которая использовалась для ее создания. Убивать процесс python - это то, что вы хотите сделать, а не оболочку, поэтому после удаления части start у вас будет код kill_process(), работающий правильно.

BTW, shell=False является по умолчанию для subprocess.Popen() и таким образом был исключен в вышеуказанном коде. Кроме того, установка p на процесс, а затем немедленное возвращение, похоже, является пустой тратой строки кода. Его можно сократить, просто вернув его напрямую (как показано в приведенном выше коде).

Смежные вопросы