求助:如何在Python 2中实现获取Windows防火墙状态功能
如何在Python 2中获取Windows防火墙状态(替代Python 3的subprocess.getoutput)
问题描述
我在Python 3中使用以下代码获取Windows防火墙所有配置文件的状态:
import subprocess def get_firewall_state(): FW = [] result = subprocess.getoutput('netsh advfirewall show allprofiles state').split() for x in result[5::6]: FW.append(x) return FW执行后能得到预期结果:
['ON', 'ON', 'ON']。但在Python 2中运行时,虽然已经安装并导入了subprocess模块,却提示不存在subprocess.getoutput函数,无法实现相同功能。请问如何在Python 2中实现相同的结果?
解决方案
问题出在subprocess.getoutput()是Python 3.1及以上版本才新增的函数,Python 2的subprocess模块并没有提供这个方法。不过我们可以用Python 2支持的subprocess.Popen来完全模拟它的行为,下面给你两种可行的实现方式:
方案一:用Popen模拟getoutput的完整行为(推荐)
这个方案会同时捕获命令的标准输出和错误输出,和Python 3中getoutput的逻辑完全一致,不管命令执行成功还是失败都会返回输出内容:
import subprocess def get_firewall_state(): FW = [] # 执行命令,合并stdout和stderr proc = subprocess.Popen( 'netsh advfirewall show allprofiles state', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True ) # 获取命令输出(Python2中返回字节流,需要解码为字符串) output, _ = proc.communicate() # Windows系统下通常用gbk编码解码,可根据实际系统编码调整 result = output.decode('gbk').split() # 和Python3代码一样的逻辑提取状态 for x in result[5::6]: FW.append(x) return FW
方案二:用check_output实现(适合Python 2.7+)
如果你的Python 2版本是2.7及以上,可以用subprocess.check_output(),但它默认只捕获标准输出,命令出错时会抛出异常,所以我们需要捕获异常来获取错误输出,模拟getoutput的容错性:
import subprocess def get_firewall_state(): FW = [] try: # 执行命令,获取标准输出 output = subprocess.check_output( 'netsh advfirewall show allprofiles state', shell=True ) except subprocess.CalledProcessError as e: # 命令执行出错时,获取错误输出 output = e.output # 解码为字符串并处理结果 result = output.decode('gbk').split() for x in result[5::6]: FW.append(x) return FW
测试验证
运行上面任意一个函数,都能得到和Python 3中一样的结果:['ON', 'ON', 'ON'],完美实现你的需求。
内容的提问来源于stack exchange,提问作者Park Yo Jin
相关产品推荐
相关产品推荐

