【问题标题】:Getting an error whenever the string is too long while passing it back to go from python script with cmd.Output()每当字符串太长时出现错误,同时使用 cmd.Output() 从 python 脚本传回
【发布时间】:2022-11-15 15:41:49
【问题描述】:

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

【问题讨论】:

  • 你似乎没有打电话给cmd.Run? (所以我猜你的示例代码不完整?)。请包含错误输出的堆栈跟踪(这应该提供有关问题原因的线索)。请注意,您正在输出错误,然后继续不管(并且完全忽略其他人),我猜这就是您感到恐慌的原因(可能是由较早的错误引起的 - 例如os.Create 失败意味着f 为零)。

标签: python go


【解决方案1】:

我自己解决了。这很简单,而不是直接打印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
", 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}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多