Golang 執(zhí)行Python腳本

一、兩種方式

  • 通過命令行的方式調(diào)用python腳本
  • github.com/sbinet/go-python

二、實現(xiàn)

1、通過命令行的方式調(diào)用python腳本

在golang對jpg圖片dpi操作未提供原生的相關(guān)接口,只好依賴python腳本達(dá)到想要的目的

  • main.py
from PIL import Image as ImagePIL, ImageFont, ImageDraw
import base64
import io
import sys

def main(argv):
    msg="success"
    try:   
        base64Str=argv[0]
        savePath=argv[1]
        xdpi=300.0
        ydpi=300.0
        argvLen=len(argv)
        if argvLen>2:
            xdpi=float(argv[2])
        if argvLen>3:
            xdpi=float(argv[3])
        if base64Str=="":
            msg="base64Str is empty"
            return msg
        if savePath=="":
            savePath="savePath is empty"
            return msg
        f = open(base64Str)
        base64Str=f.read()
        f.close()
        if base64Str.find(";base64,")>-1:
            base64Str=base64Str[base64Str.find(";base64,")+8:len(base64Str)]
        imgdata = base64.b64decode(base64Str)
        image=io.BytesIO(imgdata)
        img =ImagePIL.open(image)
        img=img.convert('RGB')
        img.save(savePath,dpi=(xdpi,ydpi))
        img.close()
    except Exception as result:
        msg=result
    finally:
        return msg

if __name__ == '__main__':
    msg=main(sys.argv[1:])
    print(msg)
  • gopython_test.go
//執(zhí)行python腳本
func CmdPythonSaveImageDpi(filePath, newFilePath string) (err error) {
    args := []string{"main.py", filePath, newFilePath}
    out, err := exec.Command("python", args...).Output()
    if err != nil {
        return
    }
    result := string(out)
    if strings.Index(result, "success") != 0 {
        err = errors.New(fmt.Sprintf("main.py error:%s", result))
    }
    return
}

//test測試
func TestCmdPython(t *testing.T) {
    //test.txt的內(nèi)容為圖片的base64字符串
    filePath := "test.txt"
    newFileName := "test.jpg"
    err :=CmdPythonSaveImageDpi(filePath,newFileName)
    if err != nil {
        t.Error(err)
        return
    }
    t.Log("轉(zhuǎn)換成功")
}

2、github.com/sbinet/go-python

使用Go 1和go工具,cgo包不能再CGO_CFLAGS從外部程序(除了pkg-config)傳遞到“假” #cgo預(yù)處理器指令。

go-python現(xiàn)在用于pkg-config獲取標(biāo)頭和庫的正確位置。遺憾的是,pkg-config程序包的命名約定在發(fā)行版和操作系統(tǒng)之間并未標(biāo)準(zhǔn)化,因此您可能必須相應(yīng)地編輯該cgoflags.go文件。

  • 安裝go-python
go get github.com/sbinet/go-python

如果go get+ pkg-config失?。?/p>

 $ cd go-python 
 $ edit cgoflags.go 
 $ make VERBOSE = 1

注意:您需要正確的標(biāo)頭和python開發(fā)環(huán)境。在Debian上,您需要安裝該python-all-dev軟件包

關(guān)于更多的安裝問題:https://github.com/sbinet/go-python/issues/28

  • values.py
#!/usr/bin/env python2

sval = "42"
ival = 666

def myfunc():
    return "sval='%s'\nival=%d" %(sval,ival)
  • main.go
package main

import (
    "fmt"
    "log"

    "github.com/sbinet/go-python"
)

func init() {
    err := python.Initialize()
    if err != nil {
        log.Panic(err.Error())
    }
}

func main() {
    module := python.PyImport_ImportModule("values")
    if module == nil {
        log.Fatal("could not import 'values'")
    }

    name := module.GetAttrString("__name__")
    if name == nil {
        log.Fatal("could not getattr '__name__'")
    }
    defer name.DecRef()
    fmt.Printf("values.__name__: %q\n", python.PyString_AsString(name))

    sval := module.GetAttrString("sval")
    if sval == nil {
        log.Fatal("could not getattr 'sval'")
    }
    defer sval.DecRef()
    fmt.Printf("values.sval: %q\n", python.PyString_AsString(sval))

    pyival := module.GetAttrString("ival")
    if pyival == nil {
        log.Fatal("could not getattr 'ival'")
    }
    defer pyival.DecRef()

    ival := python.PyInt_AsLong(pyival)
    fmt.Printf("values.ival: %d\n", ival)

    myfunc := module.GetAttrString("myfunc")
    if myfunc == nil {
        log.Fatal("could not getattr 'myfunc'")
    }
    defer myfunc.DecRef()

    o1 := myfunc.CallFunction()
    if o1 == nil {
        log.Fatal("could not call 'values.myfunc()'")
    }
    fmt.Printf("%s\n", python.PyString_AsString(o1))
    o1.DecRef()

    // modify 'test.ival' and 'test.sval'
    {
        pyival := python.PyInt_FromLong(ival + 1000)
        module.SetAttrString("ival", pyival)
        pyival.DecRef()

        pysval := python.PyString_FromString(python.PyString_AsString(sval) + " is the answer")
        module.SetAttrString("sval", pysval)
        pysval.DecRef()
    }

    o2 := myfunc.CallFunction()
    if o2 == nil {
        log.Fatal("could not call 'values.myfunc()'")
    }
    fmt.Printf("%s\n", python.PyString_AsString(o2))
    o2.DecRef()
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容