【问题标题】:Taking input when executing binary in Go在 Go 中执行二进制时接受输入
【发布时间】:2018-10-22 07:43:17
【问题描述】:

我使用下面的代码 sn-p :-

command:= exec.Command("./"+order)

out, err := command.Output()
if err != nil {
   log.Println(err)
}

fmt.Println(string(out))

这里,“order”是当前目录下名为binary的变量。当我运行此代码时,它不会要求输入并运行二进制文件,直到它打印输出语句结束。如何在运行二进制可执行文件时获取输入?

我也尝试过在 go 中使用 python,但没有效果。

【问题讨论】:

  • 你的意思是这样的:stackoverflow.com/questions/10473800/…?它还允许捕获命令的标准输出等
  • 我的意思是像执行二进制文件一样询问您的姓名并打印hello name。在这里,上面的程序不要求输入并打印 hello 并结束。那么如何获取名称的输入?
  • 您可以传递命令行参数并使用 flag 包在子进程中读取它,或者如果您想要动态的交互式输入,您可以挂钩到子进程的标准输入,请参阅:golang.org/pkg/os/exec/#example_Cmd_StdinPipe
  • @Not_a_Golfer 我尝试了给定的解决方案,但它不起作用,程序将变为动态,因此它必须是交互式的。还是谢谢!
  • 我不明白你的确切问题。您想在命令运行时将您的标准输入连接到命令的标准输入吗?

标签: go executable


【解决方案1】:

此代码询问您的姓名,然后将其传递给./hello 二进制文件,后者读取第一个参数并输出第一个参数。

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("What's your name: ")
    name, _ := reader.ReadString('\n')
    command := exec.Command("./hello", name)

    out, err := command.Output()
    if err != nil {
        log.Println(err)
    }
    fmt.Println(string(out))
}

你好.go:

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println(fmt.Sprintf("hello %s", os.Args[1]))
}

【讨论】:

  • 它不仅仅是关于 hello name 。我的意思是接受任何可执行文件的输入。
  • 您可以根据需要复制/迭代需要多次输入的代码。
  • 就是这样,我不知道正在运行的程序会接受多少次输入如果它只是显示从页面获取的一些细节,可能是 0 次,可能是 100、1000 次。这就是为什么我希望控件完全转移到该可执行文件并在其执行完成时转移回来。
  • 对不起,我终于明白了这个问题。如果在此之前没有人提出答案,我会在下班后稍微修补一下。
猜你喜欢
  • 2015-01-22
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多