【问题标题】:Call python script and catch binary output调用python脚本并捕获二进制输出
【发布时间】:2019-10-03 09:38:04
【问题描述】:

我想在 go 中操作图像,并且我已经在 python 中有一个脚本来修改图像。我只需要从 python 脚本发送图像即可。为此,我采用以下方式:

Python 脚本:

image = image_in_bytes

print (image)

Go 脚本:

cmd := exec.Command("python", "image.py")
stdout, err := cmd.StdoutPipe()
if err != nil {
    panic(err)
}
err = cmd.Start()
if err != nil {
    panic(err)
}

body, _ := ioutil.ReadAll(stdout) //I need the image in []byte
cmd.Wait()

但是对于上面的代码,golang 一直在等待,没有任何输出......

有什么想法吗?

【问题讨论】:

  • 你应该 os/exec.Cmd.Wait 等待命令完成。
  • 嗨,是的,我正在使用 cmd.Wait() 我没有错误地包含在代码中(没有复制它)。我更新了问题
  • 好吧,您丢弃所有可能有助于调试此问题的信息。您可能应该从 CombinedOutput 开始,看看您的转换脚本是否可以正常工作,如果不行,问题是什么。

标签: python go pipe exec


【解决方案1】:

对我来说完美无瑕,如下所述:

>>> with open("osx.png","rb") as imageFile:
...     img = repr(imageFile.read())
>>> imageFile.close()
>>> with open("sample.py","w") as pyfile:
...     pyfile.write(img)
>>> pyfile.close()

然后,我手动编辑 pyfile 看起来像

img = '\x89PNG\r\n\x1a\n[remainder skipped for brevity]'
print(img)

最后,我运行了以下代码:

    cmd := exec.Command("python", "sample.py")
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        panic(err)
    }
    err = cmd.Start()
    if err != nil {
        panic(err)
    }

    body, err := ioutil.ReadAll(stdout) //I need the image in []byte
    cmd.Wait()

    if err != nil {
        log.Fatalf("error reading bytes: %s", err)
    }

    log.Printf("Read %d bytes", len(body))

    o, err := os.OpenFile("img.png", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0660)
    if err != nil {
        log.Fatalf("opening img.png: %s", err)
    }
    defer o.Close()
    n, err := o.Write(body)

    if err != nil {
        log.Fatalf("writing image to file: %s", err)
    }
    if n < len(body) {
        log.Fatal("short write")
    }

https://gist.github.com/mwmahlberg/eb47495f68bed4e3cb8073447efdb53d下提供完整代码

我想可以肯定的是,您在 Python 文件中存储图像数据的方式有些奇怪。

【讨论】:

  • 很抱歉延迟接受您的回复,您真的帮了我。我忘记了我的代码中的一行...感谢您的帮助!
  • 我做了几次尝试,最后我把 StdoutPipe 放在了我之前没有注意到的 Start 命令之后....
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多