Python-获取异常的麻烦-os.system命令

时间:2018-06-19 14:49:54

标签: python try-catch os.system except taskkill

我收到的值为128,显示“未知错误”。这是我尝试过的事情,但我无法进入异常块。

还在控制台中得到:

错误:找不到进程“ NULL.exe”。

try:
    tmp = os.system("c:/windows/system32/taskkill /f /im NULL.exe")
except OSError as e:
    print("We made it into the excepetion!!" + str(e))

try:
    tmp = os.system("c:/windows/system32/taskkill /f /im NULL.exe")
except OSError:
    print("We made it into the excepetion!!")

try:
    tmp = os.system("c:/windows/system32/taskkill /f /im NULL.exe")
except os.error:
    print("We made it into the excepetion!!")

try:
    tmp = os.system("c:/windows/system32/taskkill /f /im NULL.exe")
except ValueError:
    print("We made it into the excepetion!!")

try:
    tmp = os.system("c:/windows/system32/taskkill /f /im NULL.exe")
except:
    print("We made it into the excepetion!!")

3 个答案:

答案 0 :(得分:1)

os.system()在命令失败(或找不到)时不会引发异常。当您使用错误的参数类型(它需要一个字符串)时,它只会引发异常。如果您确实需要例外,可以使用subprocess.call()

答案 1 :(得分:0)

当您的命令失败时Python不会拒绝,它只会捕获您刚运行的命令的返回码。 因此,您必须制定自定义期望并根据返回值提高它。 我用您的命令进行了一些实验。

这是错误代码,这里有我所发现的含义:

0-任务成功终止

1-拒绝访问

128-找不到进程

我针对您的问题的代码:

import os
#Making a custom Expection for ourselfs
class TaskkillError(Exception):
     def __init__(self, value): #value is the string we will return when expection is raised
         self.value = value
     def __str__(self):
         return repr(self.value)


tmp = os.system("c:/windows/system32/taskkill /f /im NULL.exe")
if tmp!=0:
    if tmp==1:
        raise TaskkillError('Acces denided') #Error code=1 Permission Error 
    if tmp==128:
        raise TaskkillError("Process not found") #Error code=128 Process not found
    else:
        raise TaskkillError("UnknowError Error Code returned by taskkill:"+str(tmp))
else:
    print("Task succesfully killed")

答案 2 :(得分:0)

好的,我终于弄清楚了,非常感谢您的帮助。我试图使用subprocess.run,call,check_output,check_call等。还有stderr等的不同参数。我还尝试捕获所读的每种错误。每次都向控制台抛出错误。在我的情况下,这是行不通的,因为我正在寻找32位和64位进程,因为他们知道每次都会失败。

最终我只需要使用Popen。通过使用Popen,我基本上可以将错误输入到PIPE中,而实际上我什至不需要try / except块。再次感谢您提供的所有帮助,这里是示例代码。

from subprocess import Popen, PIPE

bit32 = True
bit64 = True

p = Popen('c:windows/system32/taskkill /f /im notepad.exe', shell=True, stdout=PIPE, 
stderr=PIPE)
output,error = p.communicate()

if (len(output) == 0):
    print("32 bit not found")
    bit32 = False
if (len(output) > 0):
    print(output)

p = Popen('c:windows/system32/taskkill /f /im notepad64EXAMPLE.exe', shell=True, 
stdout=PIPE, stderr=PIPE)
output,error = p.communicate()

if (len(output) == 0):
   print("64 bit not found")
   bit64 = False
if (len(output) > 0):
   print(output)

if(not bit32 and not bit64):
   print("Could not find 32/64 bit process")