web-dev-qa-db-ja.com

シェルからのPythonスクリプトへの戻り値

シェルスクリプトからpythonに文字列を返そうとしています。以下のエラーが発生します。

./whiptail.sh: 10: return: Illegal number: uuiiu

pythonを直接使用してwhiptailコマンドを実行しようとしましたが、その時点でもsubprocess.Popenを使用しています。Pythonからのユーザー入力を読み取ることができません。誰かがこれを試した場合は、これを解決する方法を教えてください問題。

シェルスクリプトスニペット

#!/bin/sh


COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 78 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
                                                                        # A trick to swap stdout and stderr.
# Again, you can pack this inside if, but it seems really long for some 80-col terminal users.
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "User selected Ok and entered " $COLOR
    return $COLOR
else
    echo "User selected Cancel."
fi

echo "(Exit status was $exitstatus)"
3
muthu kumar

Ubuntuでは実際にshであるdash内で、組み込みコマンドreturnは数値のみを返すことができます-関数またはソーススクリプトのコンテキストで意味を持つ終了ステータス。ソース man sh

Returnコマンドの構文は次のとおりです。

return [exitstatus]

シェルスクリプトの他のすべては正しいように見えます。 echo $COLOR代わりにreturnして、他のエコーを抑制します。

より多くのデータをメインスクリプトに返す必要がある場合は、すべてを1行で出力し、個別のフィールドを、文字列を配列に変換できるベースとなるメインスクリプト内の区切り文字。たとえば(ここで,は区切り文字であり、-necho内の改行文字を省略します):

echo -n "$COLOR","$exitstatus"

スクリプトによって提供され、メインスクリプトでは必要とされないその他の情報は、いくつかのログファイルにリダイレクトできます。

$ cat whiptail.sh
#!/bin/sh
log_file='/tmp/my.log'

COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 78 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
exitstatus=$?

if [ $exitstatus = 0 ]; then
    echo "User selected Ok and entered $COLOR" > "$log_file"
    echo -n "$COLOR","$exitstatus"
else
    echo "User selected Cancel."  >> "$log_file"
    echo -n "CANCEL","$exitstatus"
fi

残念ながら、Pythonの経験はあまりありませんが、上記の.shスクリプトの出力を処理できるサンプル.pyスクリプトを次に示します( 参照 ):

$ cat main-script.py
#!/usr/bin/python
import subprocess

p = subprocess.Popen(['./whiptail.sh'], stdout=subprocess.PIPE)
p = p.communicate()[0]
p = p.split(",")
print "Color:    " + p[0]
print "ExitCode: " + p[1]
5
pa4080