Golang Go语言中如何以./proName的方式调用外部程序?os/exec 写蒙了…

请问请问 go 语言以./proName 的方式调用外部程序呢?例如,我想要通过 go 调用 sqluldr2 抽取文件,或者一次执行多个命令,例如 command a;command b;command c 这种方式…
谢谢大家
Golang Go语言中如何以./proName的方式调用外部程序?os/exec 写蒙了…

8 回复

可以。

更多关于Golang Go语言中如何以./proName的方式调用外部程序?os/exec 写蒙了…的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


<br>package main<br><br>import (<br> "log"<br> "os/exec"<br>)<br><br>func main() {<br> cmd := exec.Command("sleep", "1")<br> log.Printf("Running command and waiting for it to finish...")<br> err := <a target="_blank" href="http://cmd.Run" rel="nofollow noopener">cmd.Run</a>()<br> log.Printf("Command finished with error: %v", err)<br>}<br>

没有看懂您的意思,可以麻烦详细解释如何使用./来执行吗?
先付上我自己的理解:Command 第一个参数为 path,实际上是通过$PATH 环境变量进行检索,看第一个参数中的内容是否在$PATH 变量内,如果存在,则视为可执行,如果不存在,会直接返回错误。此参数为必填参数
第二个参数开始,则为 path 所需要的参数,非必填,但是如果填写了,必须是 PATH 的参数
基于这个理解,首先./程序,程序并不一定在$PATH 中,使用 exec.Command(‘程序名’)的方式会报错:未找到 PATH 中有可执行文件。如果将程序加入 path,再执行 exec.Command(‘程序名’),则会提示 exec format error。同时 name 参数中直接输入“./程序名” 也没法进行操作
麻烦您了,谢谢

不用客气。我以前是用绝对路径来做的。
也可以先拿到当前 golang 程序的绝对路径,再拼出要运行的程序的绝对路径。
利用环境变量的没有试过额

直接程序名字就可以了吧,不需要加./

我猜可能楼主和我之前是一个想法,看看这个: https://github.com/nagae-memooff/goutils/blob/master/utils.go
仅供参考,用里头的 Sysexec,就可以像直接在 shell 里敲命令一样的方式直接把字符串传进去了。
执行的时候的环境变量也是你这个 go 用户,在控制台里的时候的环境变量。不过最好用绝对路径,相对路径的比较复杂,三句两句说不清。
比如 Sysexec(history|grep iperf)这样直接传进去就行。

这个帮了我大忙了,而且还帮我发现了个不小的坑,谢谢啦,哈哈

在Golang中,使用os/exec包来调用外部程序是非常常见的操作。要以./proName的方式调用当前目录下的程序,你需要确保程序的执行权限已经设置(例如在Linux/macOS上可以通过chmod +x proName来设置),然后正确构建并使用exec.Command函数。

下面是一个简单的例子,展示如何使用os/exec包以./proName的方式调用外部程序:

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    // 构建命令,注意使用./proName表示当前目录下的程序
    cmd := exec.Command("./proName")

    // 获取命令的输出管道
    output, err := cmd.CombinedOutput()
    if err != nil {
        fmt.Printf("执行错误: %s\n", err)
    } else {
        fmt.Printf("程序输出: %s\n", string(output))
    }

    // 检查命令的退出状态
    if cmd.ProcessState != nil {
        fmt.Printf("程序退出状态: %v\n", cmd.ProcessState.ExitCode())
    }
}

在这个例子中,exec.Command("./proName")用于创建一个执行./proName的命令对象。cmd.CombinedOutput()会运行这个命令并返回其输出和错误信息(如果有的话)。此外,通过检查cmd.ProcessState.ExitCode()可以获取程序的退出状态。

确保你的程序proName是可执行的,并且和Go代码位于同一目录下,这样就可以正确调用了。

回到顶部