Inline python3 из golang, используя exe c и возвращаемый результат - PullRequest
0 голосов
/ 12 марта 2020

Я следовал этому SO-решению , чтобы вызвать python из golang и захватить возврат из кода 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 для l oop, но как это возможно из строковой команды?

заранее спасибо.

ОБНОВЛЕНИЕ:

Ниже приведен рабочий 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)

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Если вы запустите python -. Он будет читать программу с stdin. Это полезно для произвольно длинных python скриптов, поступающих из разных источников.

python_source = `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)`

 cmd := exec.Command("python", "-")
 cmd.Stdin = strings.NewReader(python_source)
 ...
0 голосов
/ 12 марта 2020

Попробуйте передать аргумент с помощью перевода строки и исправить отступ, используя необработанный строковый литерал:

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)
`)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...