加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Go说话中执行呼吁的几种方法

发布时间:2019-08-28 18:16:34 所属栏目:建站 来源:序语程言
导读:go说话用来执行一个体系的呼吁相对python来嗣魅照旧有点伟大的,执行呼吁是一个非经常见的需求,如挪用一个体系呼吁,启一个exe等,这里分为几种环境,之后同一总结一下。 只执行呼吁,不要输出功效 执行呼吁而且要获取到输出功效 阻塞和异步的执行 以下以pi
副问题[/!--empirenews.page--]

Go说话中执行呼吁的几种方法

go说话用来执行一个体系的呼吁相对python来嗣魅照旧有点伟大的,执行呼吁是一个非经常见的需求,如挪用一个体系呼吁,启一个exe等,这里分为几种环境,之后同一总结一下。

  1. 只执行呼吁,不要输出功效
  2. 执行呼吁而且要获取到输出功效
  3. 阻塞和异步的执行

以下以ping www.baidu.com 为例依次执行一下各类呼吁,首要行使尺度库中的os/exec。

在执行呼吁的时辰,我们首要行使的是os/exec包主的Cmd布局体要领,Cmd的布局体界说如下 Cmd布局体界说[1]。

首要的参数有

  1. Path string 
  2. // Args保管呼吁的参数,包罗呼吁名作为第一个参数;假如为空切片可能nil,相等于无参数呼吁。 
  3. // 
  4. // 典范用法下,Path和Args都应被Command函数设定。 
  5. Args []string 
  6. // Env指定历程的情形,如为nil,则是在当前历程的情形下执行。 
  7. Stdin io.Reader 
  8. // Stdout和Stderr指定历程的尺度输出和尺度错误输出。 
  9. // 
  10. // 假如任一个为nil,Run要了解将对应的文件描写符关联到空装备(os.DevNull) 
  11. // 
  12. // 假如两个字段沟通,统一时刻最多有一个线程可以写入。 
  13. Stdout io.Writer 
  14. Stderr io.Writer 

可是我们一样平常不直接结构Cmd布局体,而是通过exec.Command() 函数返回一个Cmd布局体指针 如 exec.Command("ping","www.baidu.com") ping为呼吁,"www.baidu.com" 为参数,在获得*Cmd往后再行使布局体要领Run,Start等要领来真正的执行呼吁。

只执行呼吁,不要输出功效这里的输出功效只是表白呼吁执行了,可是它详细的输出我们不体谅,在这种着适用的挺多的,我们只是想执行呼吁,在python里我们可以行使os.system() 函数来执行,虽然这个是阻塞的执行。

  1. >>> import os 
  2. >>> r = os.system("ping www.baidu.com") 
  3. 正在 Ping www.a.shifen.com [39.156.66.18] 具有 32 字节的数据: 
  4. 来自 39.156.66.18 的回覆: 字节=32 时刻=6ms TTL=54 
  5. 来自 39.156.66.18 的回覆: 字节=32 时刻=28ms TTL=54 
  6. 来自 39.156.66.18 的回覆: 字节=32 时刻=6ms TTL=54 
  7. 来自 39.156.66.18 的回覆: 字节=32 时刻=7ms TTL=54 
  8. 39.156.66.18 的 Ping 统计信息: 
  9.  数据包: 已发送 = 4,已吸取 = 4,丢失 = 0 (0% 丢失), 
  10. 来回行程的预计时刻(以毫秒为单元): 
  11.  最短 = 6ms,最长 = 28ms,均匀 = 11ms 
  12. >>> r 

这里的r只是获取了该呼吁的执行功效,是0暗示没有错误,可是执行呼吁的输出如 正在 Ping www.a.shifen.com..... 我们并不体谅。

执行呼吁可以行使Run() 可能Start() 要领,Run是阻塞的执行,Start() 长短阻塞的执行。

go说话中执行呼吁的几种方法

措施什么也没有输出,可是搁浅的一段时刻后才退出。假如换成command.Start() 则措施运行起来往后顿时就遏制了。

假如想要获取到像python 那种 os.system的执行功效,其拭魅这里的功效应该是ExitError,措施的退出码,应该怎么操纵呢?这里exec包里有一个专门的布局体ExitError,行使它的一些要领可以获取到ExitCode,可是想要获取到ExitCode获得获得呼吁竣事,也就是要阻塞的运行,上面行使Run() 要领可以阻塞守候执行功效,行使Start()要领往后,也可以行使Wait()要领来守候执行竣事。

go说话中执行呼吁的几种方法

通过

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

来获取到呼吁执行的退出码。

执行呼吁而且要获取到输出功效这里的输出功效是呼吁行的尺度输出可能错误输出,也就是stdout可能stderr,通过bytes.Buffer来存储。

go说话中执行呼吁的几种方法

这里获得的中文输出有乱码:

go说话中执行呼吁的几种方法

这个我查了一下一样平常都是说是配置一下节制台输出chcp可能行使:

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

这个包举办转换,我不想行使,这个往后找到要领再说吧。

呼吁行的输入偶然辰进入呼吁行会守候用户的交互,如输入nslookup。

go说话中执行呼吁的几种方法

执行不在情形变量里的呼吁像上面这个ping 呼吁,因为在windows 可能linux中,这个呼吁是在情形变量里,可是像windows中的copy 呼吁,它是不在情形变量里,正常环境下你可以在cmd中行使copy 呼吁,可是假如在go 说话中假如直接像上面那样行使是不可的。 譬喻行使上面的代码,替代一下copy 呼吁。

go说话中执行呼吁的几种方法

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读