Передача массива bash в функцию python

Я решил проблему. Я использовал e4rat для «дефрагментации» (? )приложения. Я сделал приблизительные замеры: 6 минут на загрузку до и около 30 секунд после.

1
28.08.2019, 11:58
2 ответа

Попробуйте сделать так:

arr=(0)
ret="$(python -c 'from pyscript import fun;print fun(arr)' "${arr[@]}")"
mapfile -t arr <<<"$ret" # assign returned array from python script to bash array

Предполагается, что ваш скрипт Python получает данные из командной строки и сохраняет каждый аргумент в массиве Python arr. Если ваш скрипт Python не является лишь небольшим фрагментом более крупной программы, ваш код этого не делает. Я оставлю это на ваше усмотрение. Этот ответ посвящен тому, как bash может передать массив в python, а затем изменить его на основе данных, возвращаемых из скрипта python.

Сценарий Python должен вывести массив на стандартный вывод, при этом каждый элемент должен быть разделен линией -.

@xenoid предлагает использовать:

ret="$(python -c 'import sys;from pyscript import fun;print fun(sys.argv[1:])' "${arr[@]}")"
0
28.01.2020, 00:01

Вы можете передать массив в Python, добавив его в качестве аргументов, и использовать sys.argv[1:]внутри python для его чтения.

Возвращаться к bashнемного сложно, когда ваши значения могут содержать пробелы или новые строки, но вы можете использовать вывод python, разделенный новой строкой -, вместе с readline.

arr=(0)
readarray -t arr < <(python -c '
import sys
arr=sys.argv[1:]
arr.append(1)
arr.append("a b")
for a in arr:
  print(a)
' "${arr[@]}")
printf '%s\n' "${arr[@]}"

Выход:

0
1
a b
0
28.01.2020, 00:01

Теги

Похожие вопросы