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