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内で使用して読み取ることができます。

値にスペースや改行文字を含めることができる場合、フィードバックは少しトリッキーですが、bashPythonの改行で区切られた出力を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

関連情報