在C/python中執行linux命令並得到傳回值以及輸出

來源:互聯網
上載者:User

一般來說,用shell的方便之處在於,能夠直接調用linux系統命令,方便的得到結果。

但是shell scprit的約束重重(這裡不再講了)。下面說一下在C和python中如何調用linux命令、得到傳回值並得到輸出

1. python,使用os庫/commands庫

方法1)使用commands.getstatusoutput方法,這是一個神奇的方法,能夠直接得到傳回值以及命令輸出。官網說明:http://docs.python.org/library/commands.html

import osimport 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 xp.close()

p相當於開啟的一個檔案

 方法4) 使用
subprocess模組,這個是比較新的模組,要替代

os.systemos.spawn*os.popen*popen2.*commands.*

這些模組。 subprocess應用執行個體:

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

import subprocesscmd=['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;                                                                      } 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.