在python中将标准错误输出重定向到/ dev / null

时间:2015-09-01 08:35:19

标签: python linux

我创建了以下脚本(Python版本2.x)以验证IP地址

如果传递了IP验证,脚本将打印确定

否则脚本将打印失败

验证非常好,

但是我不想打印的是异常产生的错误(参见脚本的Exe),

我只想打印OK或Fail,并将标准错误重定向为null

请在我的脚本中建议需要更新的内容吗?

#!/usr/bin/python





import commands
import subprocess
import os
import re
import socket






def validIP(address):
   parts = address.split(".")
   if len(parts) != 4:
       return False
   for item in parts:
       if not 0 <= int(item) <= 255:
           return False
   try:
       socket.inet_aton(address)
       return True
   except socket.error:
       return False


       f = open('/dev/null', 'w')
       sys.stdout = f
       f.close()


address = raw_input("Please enter IP address : ")
res = validIP(address)

if res == True:
    print"OK"
else:
    print "Fail"

执行脚本:(来自Linux red-hat machine version 6)

 ./Check_IP_Address.py

  Please enter IP address : 192.9.200.WRONG
  Traceback (most recent call last):
  File "./Check_IP_Address.py", line 37, in <module>
  res = validIP(address)
  File "./Check_IP_Address.py", line 23, in validIP
  if not 0 <= int(item) <= 255:
  ValueError: invalid literal for int() with base 10: 'WRONG'

2 个答案:

答案 0 :(得分:1)

根据您的陈述,抓住ValueError例外可以解决您的问题。你不应该只留下Errors or Exceptions。你应该直接抓住它们。

try:
   if not 0 <= int(item) <= 255:
       return False
except ValueError as e:
   return False

答案 1 :(得分:0)

看起来你不知道如何正确捕获异常,这让我想知道stderr是否在你的范围内 - 你不应该仅通过复制粘贴示例进行编程,你应该努力理解你编写的代码。如果你想通过捕获异常来使它静音,你只需抓住它:

for items in parts:
    try:
        if not 0 <= int(item) <= 255:
             return False
    except ValueError:
        return False # probably the correct thing to do if `item` is not convertible to int.

请注意,如果没有计划如何成功地面对错误,您可能不应该使错误沉默。从蟒蛇的禅宗:

  • 错误永远不会无声地传递。
  • 除非明确默许。

第二个意思是通过实际处理异常来明确表达他们的沉默。如果你无法处理异常,那么退出并获得追溯可能会更好。

如果你无论如何都要沉默stderr(你可能不应该这样做,因为这会使你没有处理的错误变得沉寂,这意味着你不会知道为什么你的程序突然就会消失掉出现问题)您可以通过在dev/null上打开dup2STDERR_FILENO文件描述符来替换(即2)。例如

import os

f = open("/dev/null", "w")

os.dup2(f.fileno(), 2)

f.close()

f.fubar # this will fail and raise exception - which you shouldn't see