日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Go語言中執(zhí)行命令的幾種方式

go語言用來執(zhí)行一個(gè)系統(tǒng)的命令相對(duì)python來說還是有點(diǎn)復(fù)雜的,執(zhí)行命令是一個(gè)非常常見的需求,如調(diào)用一個(gè)系統(tǒng)命令,啟一個(gè)exe等,這里分為幾種情況,之后統(tǒng)一總結(jié)一下。

來賓網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),來賓網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為來賓近千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的來賓做網(wǎng)站的公司定做!

  1. 只執(zhí)行命令,不要輸出結(jié)果
  2. 執(zhí)行命令并且要獲取到輸出結(jié)果
  3. 阻塞和異步的執(zhí)行

以下以ping www.baidu.com 為例依次執(zhí)行一下各種命令,主要使用標(biāo)準(zhǔn)庫(kù)中的os/exec。

在執(zhí)行命令的時(shí)候,我們主要使用的是os/exec包主的Cmd結(jié)構(gòu)體方法,Cmd的結(jié)構(gòu)體定義如下 Cmd結(jié)構(gòu)體定義[1]。

主要的參數(shù)有

 
 
 
 
  1. Path string 
  2. // Args保管命令的參數(shù),包括命令名作為第一個(gè)參數(shù);如果為空切片或者nil,相當(dāng)于無參數(shù)命令。 
  3. // 
  4. // 典型用法下,Path和Args都應(yīng)被Command函數(shù)設(shè)定。 
  5. Args []string 
  6. // Env指定進(jìn)程的環(huán)境,如為nil,則是在當(dāng)前進(jìn)程的環(huán)境下執(zhí)行。 
  7. Stdin io.Reader 
  8. // Stdout和Stderr指定進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出。 
  9. // 
  10. // 如果任一個(gè)為nil,Run方法會(huì)將對(duì)應(yīng)的文件描述符關(guān)聯(lián)到空設(shè)備(os.DevNull) 
  11. // 
  12. // 如果兩個(gè)字段相同,同一時(shí)間最多有一個(gè)線程可以寫入。 
  13. Stdout io.Writer 
  14. Stderr io.Writer 

但是我們一般不直接構(gòu)造Cmd結(jié)構(gòu)體,而是通過exec.Command() 函數(shù)返回一個(gè)Cmd結(jié)構(gòu)體指針 如 exec.Command("ping","www.baidu.com") ping為命令,"www.baidu.com" 為參數(shù),在得到*Cmd以后再使用結(jié)構(gòu)體方法Run,Start等方法來真正的執(zhí)行命令。

只執(zhí)行命令,不要輸出結(jié)果這里的輸出結(jié)果只是表明命令執(zhí)行了,但是它具體的輸出我們不關(guān)心,在這種其實(shí)用的挺多的,我們只是想執(zhí)行命令,在python里我們可以使用os.system() 函數(shù)來執(zhí)行,當(dāng)然這個(gè)是阻塞的執(zhí)行。

 
 
 
 
  1. >>> import os 
  2. >>> r = os.system("ping www.baidu.com") 
  3. 正在 Ping www.a.shifen.com [39.156.66.18] 具有 32 字節(jié)的數(shù)據(jù): 
  4. 來自 39.156.66.18 的回復(fù): 字節(jié)=32 時(shí)間=6ms TTL=54 
  5. 來自 39.156.66.18 的回復(fù): 字節(jié)=32 時(shí)間=28ms TTL=54 
  6. 來自 39.156.66.18 的回復(fù): 字節(jié)=32 時(shí)間=6ms TTL=54 
  7. 來自 39.156.66.18 的回復(fù): 字節(jié)=32 時(shí)間=7ms TTL=54 
  8. 39.156.66.18 的 Ping 統(tǒng)計(jì)信息: 
  9.  數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失), 
  10. 往返行程的估計(jì)時(shí)間(以毫秒為單位): 
  11.  最短 = 6ms,最長(zhǎng) = 28ms,平均 = 11ms 
  12. >>> r 

這里的r只是獲取了該命令的執(zhí)行結(jié)果,是0表示沒有錯(cuò)誤,但是執(zhí)行命令的輸出如 正在 Ping www.a.shifen.com..... 我們并不關(guān)心。

執(zhí)行命令可以使用Run() 或者Start() 方法,Run是阻塞的執(zhí)行,Start() 是非阻塞的執(zhí)行。

程序什么也沒有輸出,但是停頓的一段時(shí)間后才退出。如果換成command.Start() 則程序運(yùn)行起來以后馬上就停止了。

如果想要獲取到像python 那種 os.system的執(zhí)行結(jié)果,其實(shí)這里的結(jié)果應(yīng)該是ExitError,程序的退出碼,應(yīng)該怎么操作呢?這里exec包里有一個(gè)專門的結(jié)構(gòu)體ExitError,使用它的一些方法可以獲取到ExitCode,但是想要獲取到ExitCode得到得到命令結(jié)束,也就是要阻塞的運(yùn)行,上面使用Run() 方法可以阻塞等待執(zhí)行結(jié)果,使用Start()方法以后,也可以使用Wait()方法來等待執(zhí)行結(jié)束。

通過

 
 
 
 
  1. command.ProcessState.Sys().(syscall.WaitStatus).ExitCode 

來獲取到命令執(zhí)行的退出碼。

執(zhí)行命令并且要獲取到輸出結(jié)果這里的輸出結(jié)果是命令行的標(biāo)準(zhǔn)輸出或者錯(cuò)誤輸出,也就是stdout或者stderr,通過bytes.Buffer來存儲(chǔ)。

這里得到的中文輸出有亂碼:

這個(gè)我查了一下一般都是說是設(shè)置一下控制臺(tái)輸出chcp或者使用:

 
 
 
 
  1. golang.org/x/text/encoding/simplifiedchinese  

這個(gè)包進(jìn)行轉(zhuǎn)換,我不想使用,這個(gè)以后找到方法再說吧。

命令行的輸入有時(shí)候進(jìn)入命令行會(huì)等待用戶的交互,如輸入nslookup。

執(zhí)行不在環(huán)境變量里的命令像上面這個(gè)ping 命令,由于在windows 或者linux中,這個(gè)命令是在環(huán)境變量里,但是像windows中的copy 命令,它是不在環(huán)境變量里,正常情況下你可以在cmd中使用copy 命令,但是如果在go 語言中如果直接像上面那樣使用是不行的。 例如使用上面的代碼,替換一下copy 命令。

得到的輸出結(jié)果為:

 
 
 
 
  1. run error :exec: "copy": executable file not found in %PATH% 

應(yīng)該使用cmd", "/C" copy命令:


名稱欄目:Go語言中執(zhí)行命令的幾種方式
網(wǎng)站地址:http://www.5511xx.com/article/dpdpspc.html