Python创建子进程, 执行 'ping ....',判断运行结果

创建一个新的子进程, 执行 ‘ping 192.168.0.102’,等待子进程结束后或者等待时间到达后,读取子进程的返回值和子进程的标准输出,判断子进程是否正常退出和标准输出中是否有‘timed out’ 然后给全局变量FREEMV_INTERACT_RESULT赋值。

import time
import threading
import os
import subprocess

taskkill = os.getenv('SYSTEMROOT')+'/System32/taskkill.exe'

def interact_run(cmd,timeout=2):
    def timeout_trigger(sub_process):
        print 'timeout function trigger'
        os.system(taskkill+' /T /F /pid '+ str(sub_process.pid))
    timeout = float(timeout)
    p = subprocess.Popen(cmd, 0, None, None, subprocess.PIPE, subprocess.PIPE,shell=True)
    t = threading.Timer(timeout*60, timeout_trigger, args=(p,))
    t.start()
    p.wait()
    t.cancel()

    ret_val = p.returncode
    ret_info = p.stdout.read()
    return ret_val,ret_info

time.sleep(5)
ret = interact_run('ping 192.168.0.102')
if ret[0] == 0 and ('timed out' not in ret[1]):
    FREEMV_INTERACT_RESULT = 0
else:
    FREEMV_INTERACT_RESULT = 1

1.
p = subprocess.Popen(cmd, 0, None, None, subprocess.PIPE, subprocess.PIPE,shell=True)

详解
http://www.cnblogs.com/fengbeihong/articles/3374132.html
subprocess.Popen
subprocess模块定义了一个类: Popen
class subprocess.Popen( args,
bufsize=0,
executable=None,
stdin=None,
stdout=None,
stderr=None,
preexec_fn=None,
close_fds=False,
shell=False,
cwd=None,
env=None,
universal_newlines=False,
startupinfo=None,
creationflags=0)
这里写图片描述

详解
subprocess.PIPE实际上为文本流提供一个缓存区。
我们可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe)。
http://www.jb51.net/article/66440.htm

2.
import threading
t = threading.Timer(timeout*60, timeout_trigger, args=(p,))

详解
python通过线程实现定时器timer的方法.
让系统定时执行指定的函数.

3.
t.start()

详解
run方法 和start方法: 它们都是从Thread继承而来的.
run()方法将在线程开启后执行,可以把相关的逻辑写到run方法中(通常把run方法称为活动[Activity]。);
start()方法用于启动线程。

p.wait()
详解
Popen.wait()
等待子进程结束。设置并返回returncode属性。

4.
Python的调试方法pdb

启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。
python -m pdb err.py
以参数-m pdb启动后,pdb定位到下一步要执行的代码。

输入命令l来查看代码。
输入命令n可以单步执行代码。
任何时候都可以输入命令p 变量名来查看变量。
输入命令q结束调试,退出程序。
http://www.jb51.net/article/65072.htm

5.
ret_val = p.returncode
ret_info = p.stdout.read()
return ret_val,ret_info

if ret[0] == 0 and (‘timed out’ not in ret[1]):
FREEMV_INTERACT_RESULT = 0
else:
FREEMV_INTERACT_RESULT = 1

详解
Popen.returncode
获取进程的返回值。如果进程还没有结束,返回None。

上面代码的意思是:
如果子进程的返回值为0,同时在标准输出中没有’timed out’这个的文字log,给FREEMV_INTERACT_RESULT 这个变量赋值为 0 。 其余情况下赋值为1 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值