Есть ли способ обработки ошибок командной строки Window? - PullRequest
0 голосов
/ 04 мая 2019

Часть моего кода связана с завершением процесса пользовательским вводом с помощью командной строки Windows. Вот фрагмент моего проекта.

import subprocess

def kill_process():
    # Displays running processes similar to linux 'top' command.
    subprocess.call(['tasklist'])

    cmd = input('\nEnter process name or process ID to kill process: ')
    try:
        # Kills process via user input.
        subprocess.call(['taskkill', '/pid', cmd])
    except:
        print('Invalid process name or ID.\n')
        kill_process()

Если пользователь вводит неверное имя процесса или идентификатор, я получаю эту ошибку:

ОШИБКА: процесс "user_input" не найден.

Я полагаю, что эта ошибка не обрабатывается Python, а скорее Windows. Поэтому я не могу поймать исключение и обработать его соответственно. Когда возникает эта ошибка, она вынуждает мой код завершиться, что является проблемой, потому что мне нужен код для продолжения, даже если возникла ошибка пользователя.

Я могу анализировать данные броска и получать имена / идентификаторы процессов, используя subprocess.check_output () с чем-то вроде этого;

cmd = input('\nEnter process name or process ID to kill process: ')

if cmd in subprocess.check_output(['tasklist'], encoding='UTF-8'):
    subprocess.call(['taskkill', '/pid', cmd])

но, если возможно, я скорее избегу этого метода. Я мог бы столкнуться с подобными ошибками, когда имел дело с CMD позже, и анализ данных этого типа может стать утомительным.

1 Ответ

1 голос
/ 04 мая 2019

taskkill возвращает ненулевой код ошибки, если уничтожение не удалось , а subprocess.call возвращает этот код . Просто проверьте это вместо использования исключений:

import subprocess

def kill_process():
    cmd = input('\nEnter process name or process ID to kill process: ')

    return_code = subprocess.call(['taskkill', '/pid', cmd])
    print(result)

    # 128 == no such process
    if return_code == 128: 
        print('Invalid process name or ID.\n')
        kill_process()

Обратите внимание, в Python 3, который вы, похоже, используете, subprocess.run представляется предпочтительным. sunprocess.call указан под «Старые высокоуровневые API» . Sience run возвращает CompletedProcess, вам нужно немного изменить код:

. . .
    comp_proc = subprocess.call(['taskkill', '/pid', cmd])

    if comp_proc.returncode == 128: 
        . . .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...