有没有一种方法可以处理Window的命令行错误?

时间:2019-05-04 15:46:17

标签: python windows exception subprocess

我的部分代码处理使用Window的命令提示符通过用户输入终止进程。这是我的项目的一个片段。

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()

如果用户输入了无效的进程名称或ID,则会出现此错误:

  

错误:找不到进程“ user_input”。

我相信此错误不是由python处理,而是由Windows处理。因此,我无法捕获异常并进行相应处理。出现此错误时,它会强制我的代码退出,这是一个问题,因为我需要代码继续,甚至引发用户错误。

我可以使用诸如此类的 subprocess.check_output()解析抛出的数据并获取进程名称/ ID;

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 个答案:

答案 0 :(得分:1)

taskkill returns a non-zero error code if the kill failedsubprocess.call returns that code。只需检查即可,而不使用异常:

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列在"Older high-level APIs"下。 Sience run返回一个CompletedProcess,您需要稍微更改一下代码:

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

    if comp_proc.returncode == 128: 
        . . .