我的部分代码处理使用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时,我可能会遇到类似的错误,并且解析此类数据可能会变得乏味。
答案 0 :(得分:1)
taskkill
returns a non-zero error code if the kill failed和subprocess.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:
. . .