将 bash 数组传递给 python 函数

将 bash 数组传递给 python 函数

我需要将 bash 脚本中定义的数组发送到 python 脚本,该脚本修改并返回该数组。然后需要再次分配给 bash 数组。此外,就像 bash 必须维护数组值而 python 必须修改值一样。

重击脚本:

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

Python脚本:

def fun(arr):
   arr.append(1)
   return arr

帮我摆脱这个困境。

答案1

尝试这样的事情:

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 脚本需要将数组打印到 stdout,每个元素用换行符分隔。

@xenoid的建议是使用:

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

答案2

您可以将数组传递给 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

相关内容