在C/python中执行linux命令并得到返回值以及输出

171 篇文章 4 订阅
44 篇文章 0 订阅


一般来说,用shell的方便之处在于,能够直接调用linux系统命令,方便的得到结果。

但是shell scprit的约束重重(这里不再讲了)。下面说一下在C和python中如何调用linux命令、得到返回值并得到输出

1. python,使用os库/commands库

方法1)使用commands.getstatusoutput方法,这是一个神奇的方法,能够直接得到返回值以及命令输出。官网说明:http://docs.python.org/library/commands.html

import os

import commands

        status,output=commands.getstatusoutput(cmdstr)

#***********************下面代码是判断返回值**********************************************************
        if False==os.WIFEXITED(status) or 0!=os.WEXITSTATUS(status):                       
            self.logging.info("check port false. port [%s] has not been listened. cmdstr: [%s]", port, cmdstr)                                                       
            return False 
        self.logging.info("check port true. port [%s] has been listened. cmdstr: [%s]", cmdstr) 
        return True      

status是返回值,ouput是输出

#但是这种方法存在一个问题,就是如果命令中(cmdstr)含有&符号,这个命令会出错,此时,需要使用os.system方法


方法2)使用os.system

status = os.system(cmdstr)

status是返回值,得不到输出,检查的方法如上

 

方法3)使用os.popen,这是一个和C相似的方法,既能得到返回值,也能得到输出,缺点是用起来稍微麻烦一些

p=os.popen('ssh 10.3.16.121 ps aux | grep mysql')
x=p.read()
print x
p.close()

p相当于打开的一个文件

 方法4) 使用 subprocess模块,这个是比较新的模块,要替代

os.system
os.spawn*
os.popen*
popen2.*
commands.*
这些模块。 subprocess应用实例:


subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

import subprocess
cmd=['ls','-l']
subprocess.call(cmd)

subprocess.call('cat /etc/passwd',shell=True)


2. C中使用#include <stdio.h> 库,下面是我写的一个调用系统命令的函数。

使用popen,这个好处就是既能得到返回值也能得到输出,我将调用以及返回值判断封装了一下,便于平时使用

#include <stdio.h> 

int execute_cmd(const char *cmdstr, char * retstr, int len)                       
{                                                                               
    FILE *fpin=NULL;                                                        
    if(NULL==(fpin=popen(cmdstr,"r")))                                
    {                                                                           
        WRITE_LOG_EX(UL_LOG_FATAL,"execute command '%s' failed: %s",cmdstr,strerror(errno));  
        return 1;                                                             
    }                                                                           
                                                                                     
    if(NULL == fgets(retstr, len, fpin))                                           
    {                                                                                   
        retstr = NULL;                                                       
    }                                                                          
    return 0;                                                                      
} 



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值