亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

每當字符串太長而將其傳回以使用 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 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號