为了账号安全,请及时绑定邮箱和手机立即绑定

每当字符串太长而将其传回以使用 cmd.Output() 从 python 脚本返回时都会出错

每当字符串太长而将其传回以使用 cmd.Output() 从 python 脚本返回时都会出错

Go
料青山看我应如是 2023-03-15 13:50:02
我正在用 python 解析一个 pdf 文件并将文本字符串发送回 golang 服务器。当我使用较小的 pdf 文件运行代码时,它可以正常工作,但对于较大的 pdf 文件,它会返回exit status 1这是我正在使用的代码:func parsePdf(path string) string {    cmd := exec.Command("python", "pdf_parser.py", path)    output, err := cmd.Output() //this line throws error    if err != nil {        fmt.Println(err)    }    f, _ := os.Create("go-pdf-output.txt")    _, err := f.WriteString(string(output))    if err != nil {        fmt.Println(err2)    }    return string(output)}这是我得到的错误cmd.Errpanic: runtime error: invalid memory address or nil pointer dereference[signal 0xc0000005 code=0x0 addr=0x18 pc=0xfc00e6]这是我的 python 脚本,我在其中打印解析后的字符串:import fitzimport syspath = sys.argv[1]doc = fitz.open(path)list = []for page in doc:    text = page.get_text("text")    list.append(text)outputString= ' '.join(list)print(outputString)如果我单独运行 python 脚本,它会完美运行。在此行抛出错误output, err := cmd.Output()如果 pdf 文件很小,它工作正常但如果 pdf 文件较大(例如:一本书 pdf),它会失败。我认为错误是可以返回的字节大小cmd.Output()。有没有更好的方法将数据从 python 脚本传输到 golang。
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我自己解决了。这很简单,而不是直接打印outputString,而是打印一个json.dumps(). 我将在下面提供整个代码:


main.go文件


package main


import (

    "bytes"

    "encoding/json"

    "fmt"

    "log"

    "os"

    "os/exec"

)


type ParseText struct {

    Text string `json:"text"`

}


func main() {

    fmt.Println("Running...")


    pdfPath := "./Y2V7 Full With SS-2.pdf"

    _, err := parsePdf(pdfPath)

    if err != nil {

        fmt.Println(err)

    }

}


func parsePdf(path string) (string, error) {

    cmd := exec.Command("python", "pdf_parser.py", path)

    var stdout, stderr bytes.Buffer


    cmd.Stdout = &stdout

    cmd.Stderr = &stderr

    err := cmd.Run()

    if err != nil {

        log.Printf("Error when executing python: %s\n", stderr.Bytes())

        return "", fmt.Errorf("Error executing python: %w", err)

    }


    res := ParseText{}

    err = json.Unmarshal(stdout.Bytes(), &res)

    writeToFile("go-pdf.txt", res.Text)

    return res.Text, err

}

func writeToFile(fileName, text string) {

    f, err := os.Create(fileName)


    if err != nil {

        log.Fatal(err)

    }


    defer f.Close()


    _, err2 := f.WriteString(text)


    if err2 != nil {

        log.Fatal(err2)

    }

}

pdf-parser.py文件


import fitz

import sys

import json


URL = sys.argv[1]

doc = fitz.open(URL)

list = []


for page in doc:

    text = page.get_text("text")

    list.append(text)


outputString= ' '.join(list)

print(json.dumps({"text":outputString}))


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信