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

我正在用 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.Err


panic: runtime error: invalid memory address or nil pointer dereference

[signal 0xc0000005 code=0x0 addr=0x18 pc=0xfc00e6]

这是我的 python 脚本,我在其中打印解析后的字符串:


import fitz

import sys


path = 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。


料青山看我应如是
浏览 86回答 1
1回答

慕尼黑的夜晚无繁华

我自己解决了。这很简单,而不是直接打印outputString,而是打印一个json.dumps(). 我将在下面提供整个代码:main.go文件package mainimport (    "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 fitzimport sysimport jsonURL = 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}))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go