我正在使用pythons子进程模块的subprocess.check_output来执行ping命令。我就是这样做的:
output = subprocess.check_output(["ping","-c 2 -W 2","1.1.1.1")它正在引发一个CalledProcessError,并表示输出是函数的参数之一。有人能帮我看一下输出结果吗。我希望将输出读入字符串并解析它。例如,如果ping返回
100%丢包
我要抓住这个。如果还有其他更好的,way..please建议。谢谢。
发布于 2011-09-27 20:39:26
在参数列表中,每个条目必须是独立的。使用
output = subprocess.check_output(["ping", "-c","2", "-W","2", "1.1.1.1"])应该能解决你的问题。
发布于 2011-11-22 23:05:48
根据Python os模块文档的说法,从Python2.6开始,os.popen就被废弃了。
我认为现代Python的解决方案是从子流程模块中使用check_output()。
来自子进程Python文档
subprocess.check_output(args,*,stdin=None,stderr=None,shell=False,universal_newlines=False)运行带有参数的命令,并以字节字符串的形式返回其输出。 如果返回代码为非零,则会引发CalledProcessError。CalledProcessError对象将在返回代码属性中有返回代码,在输出属性中有任何输出。
如果您在Python2.7(或更高版本)中运行以下代码:
import subprocess
try:
print subprocess.check_output(["ping", "-n", "2", "-w", "2", "1.1.1.1"])
except subprocess.CalledProcessError, e:
print "Ping stdout output:\n", e.output您应该会看到如下所示的输出:
Ping stdout output:
Pinging 1.1.1.1 with 32 bytes of data:
Request timed out.
Request timed out.
Ping statistics for 1.1.1.1:
Packets: Sent = 2, Received = 0, Lost = 2 (100% loss),可以解析e.output字符串以满足操作需要。
如果您想要返回代码或其他属性,它们在CalledProccessError中,这可以通过使用pdb来看到。
(Pdb)!dir(e)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__',
'__getattribute__', '__getitem__', '__getslice__', '__hash__', '__init__',
'__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__',
'__unicode__', '__weakref__', 'args', 'cmd', 'message', 'output', 'returncode']发布于 2017-11-08 17:18:51
如果您希望获得stdout和stderr返回(包括在发生事件时从CalledProcessError中提取它),请使用以下方法:
import subprocess
def call_with_output(command):
success = False
try:
output = subprocess.check_output(command, stderr=subprocess.STDOUT).decode()
success = True
except subprocess.CalledProcessError as e:
output = e.output.decode()
except Exception as e:
# check_call can raise other exceptions, such as FileNotFoundError
output = str(e)
return(success, output)
call_with_output(["ls", "-l"])这是与Python 2和3兼容的。
如果您的命令是字符串而不是数组,请将其前缀为:
import shlex
call_with_output(shlex.split(command))https://stackoverflow.com/questions/7575284
复制相似问题