- 论坛徽章:
- 4
|
本帖最后由 linux_c_py_php 于 2012-09-07 17:19 编辑
subprocess.call("ping -c 1 %s" % ip,shell = True,stdout = open('/dev/null','w'),stderr = subprocess.STDOUT)
分析: 使用/bin/bash解析命令"ping -c 1 %s" %ip, 也就是使用ping程序发1个ICMP请求应答包到ip. 另外, 子进程的标准输出重定向到/dev/null, 也就是丢弃标准输出, 并且将标准错误重定向到标准输出, 也就是同样重定向到了/dev/null. 这条语句的返回值其实就是ping的返回值, 从实现角度来讲, 其实是当前py进程创建shell进程, shell进程创建ping进程, 最终ping进程的返回值被shell进程wait, 紧接着shell进程将ping进程的返回码继续向上返回到py进程, 然后py进程wait得到这个状态码, 可以判断是否ping通, 因为ping程序如果成功返回0, 其他任何情况返回非0.
subprocess.Popen("arping -c 1 %s" % ip,shell = True,stdout = subprocess.PIPE)
分析:一样, arp请求局域网内的ip机器的mac, 有相应arping返回0, 否则返回1, 一路从arping->shell->py返回上来,stdout是重定向子进程的标准输出到一个管道, py进程就可以读取管道得到子进程的输出了.
怎么读取arping的标准输出呢?
Popen.communicate(input=None) 自己看手册.
|
|