猿问

使用 exec 从 golang 内联 python3 和返回结果

我一直在遵循这个从 golang 调用 python 并捕获 go 代码的返回值以解码简单的 csv 并转换为 json。


这可以通过 cli 作为命令运行:


$ python3.7 -c "exec(\"import csv,json  \na=list() \nfor i in csv.DictReader(open('/Users/Astra/data_in/Data.csv', 'r')): a.append(json.dumps(i))   \nb=dict(enumerate(a))   \nc=json.dumps(b, sort_keys=True, indent=4)   \nprint(c)\")"

来自 Golang 的命令集如下:


cmd := exec.Command("python", "-c", "import csv,json; a=list(); for i in csv.DictReader(open('/Users/Astra/data_in/Data.csv', 'r')): a.append(json.dumps(i)); b=dict(enumerate(a)); c=json.dumps(b, sort_keys=True, indent=4); print(c)")

但是,我收到以下错误:


exit status 1

  File "<string>", line 1

    import csv,json; a=list(); for i in csv.DictReader(open('/Users/Astra/data_in/Data.csv', 'r')): a.append(json.dumps(i)); b=dict(enumerate(a)); c=json.dumps(b, sort_keys=True, indent=4); print(c)

                                                                                                                                                ^

SyntaxError: invalid syntax

我想我需要将缩进移回与 for 循环平行的位置,但是字符串化命令怎么可能做到这一点呢?


提前致谢。


更新:


下面是等效的 python 工作,分配c变量的行需要沿着for loop


a = list()

for i in csv.DictReader(open('/Users/Astra/data_in/Data.csv', 'r')):

    a.append(json.dumps(i))

c = json.dumps(dict(enumerate(a)), sort_keys=True, indent=4)

print(c)


慕田峪9158850
浏览 223回答 2
2回答

Helenr

如果你跑python -。它将读取程序stdin。这对于来自不同来源的任意长的 python 脚本非常有用。python_source = `import csv,json&nbsp;a=list()for i in csv.DictReader(open('/Users/Astra/data_in/Data.csv', 'r')):&nbsp; &nbsp; a.append(json.dumps(i))b=dict(enumerate(a))c=json.dumps(b, sort_keys=True, indent=4)print(c)`&nbsp;cmd := exec.Command("python", "-")&nbsp;cmd.Stdin = strings.NewReader(python_source)&nbsp;...

弑天下

尝试使用换行符传递参数并使用原始字符串文字正确缩进:cmd := exec.Command("python", "-c", `import csv,json;&nbsp;a=list();&nbsp;for i in csv.DictReader(open('/Users/Astra/data_in/Data.csv', 'r')):&nbsp;&nbsp; &nbsp;a.append(json.dumps(i));&nbsp;&nbsp; &nbsp;b=dict(enumerate(a));&nbsp;&nbsp; &nbsp;c=json.dumps(b, sort_keys=True, indent=4);&nbsp;&nbsp; &nbsp;print(c)`)
随时随地看视频慕课网APP

相关分类

Go
我要回答