Они имеют разные среды выполнения. Golang не может напрямую обращаться к переменным во время выполнения Python. Vica наоборот. Однако вы можете запрограммировать их на передачу значений переменных через стандартный ввод / вывод или переменные окружения. Ключ должен определить правильный формат для обмена информацией.
Например, если скрипт Python принимает аргументы в качестве входных данных и выводит результат, закодированный как JSON, в стандартный вывод. Затем вы можете вызвать скрипт с правильными аргументами и декодировать стандартный вывод в формате JSON.
Например:
range.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:])
main.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"}
Вы можете использовать главную() аналогично предыдущему для этого сценария:
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"}