如何使Python模块中的变量在Go中可用?

2024-04-19 21:13:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Go中构建一个工具,它需要提供一种方法来解析在Python脚本的全局范围内声明的变量。将来我想把这个扩展到节点.js也。它需要跨平台。你知道吗

基本上,如果某人有以下Python代码:

#!/usr/bin/env python

hello = "world"
some_var = "one"
another_var = "two"
var_three = some_func()

我想在我的Golang代码中访问这些变量键和值。对于函数,我希望能够访问它返回的值。你知道吗

我目前的想法是使用Golang exec.Command函数运行脚本,并以某种格式(例如JSON)将变量打印到它的stdout,而这些格式又可以用Golang进行解析。思想?你知道吗


Tags: 工具方法函数代码脚本声明go节点
1条回答
网友
1楼 · 发布于 2024-04-19 21:13:46

它们属于不同的运行时环境。Golang不能直接访问Python运行时中的变量。维卡反之亦然。但是,您可以对它们进行编程,以便通过标准I/O或环境变量传递变量值。关键是确定适当的信息交流格式。你知道吗

例如,如果python脚本将参数作为输入并将结果(编码为JSON)打印到stdout。然后可以使用适当的参数调用脚本,并将stdout解码为JSON。你知道吗

例如:

你知道吗范围.py

import json
import sys

def toNum(str):
    return int(str)

def main(argv):
    # Basically called range() with all the arguments from script call
    print(json.dumps(list(range(*map(toNum, argv)))))

if __name__ == '__main__':
    main(sys.argv[1:])

你知道吗主菜单.go

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "os/exec"
)

func pythonRange(start, stop, step int) (c []byte, err error) {
    return exec.Command(
        "python3",
        "./range.py",
        fmt.Sprintf("%d", start),
        fmt.Sprintf("%d", stop),
        fmt.Sprintf("%d", step),
    ).Output()
}

func main() {
    var arr []int

    // get the output of the python script
    result, err := pythonRange(1, 10, 1)
    if err != nil {
        log.Fatal(err)
    }

    // decode the stdout of the python script
    // as a json array of integer
    err = json.Unmarshal(result, &arr)
    if err != nil {
        log.Fatal(err)
    }

    // show the result with log.Printf
    log.Printf("%#v", arr)
}

输出全局变量

要将Python中的全局变量作为JSON对象输出,请执行以下操作:

import json

def dump_globals():
    # Basically called range() with all the arguments from script call
    vars = dict()
    for (key, value) in globals().items():
        if key.startswith("__") and key.endswith("__"):
            continue # skip __varname__ variables
        try:
            json.dumps(value) # test if value is json serializable
            vars[key] = value
        except:
            continue
    print(json.dumps(vars))

foo = "foo"
bar = "bar"

dump_globals()

输出:

{"foo": "foo", "bar": "bar"}

对于此脚本,可以使用与上一个类似的main():


import (
    "encoding/json"
    "fmt"
    "log"
    "os/exec"
)

func pythonGetVars() (c []byte, err error) {
    return exec.Command(
        "python3",
        "./dump_globals.py",
    ).Output()
}

func main() {
    var vars map[string]interface{}

    // get the output of the python script
    result, err := pythonGetVars()
    if err != nil {
        log.Fatal(err)
    }

    // decode the json object
    err = json.Unmarshal(result, &vars)
    if err != nil {
        log.Fatal(err)
    }

    // show the result with log.Printf
    fmt.Printf("%#v", vars)
}

输出:

map[string]interface {}{"bar":"bar", "foo":"foo"}

相关问题 更多 >