0

私はこのブロックを持っています:

if data[0] == OUTPUT:
    pin,val = ord(data[0]),ord(data[1])
    if (pin == 1): #Turn Master Bedroom Light on
        process = subprocess.call(cmd1, stdout=subprocess.PIPE)
        print process
    elif (pin == 2): #Turn Master Bedroom Light off
        process = subprocess.call(cmd2, stdout=subprocess.PIPE)
        print process
    elif (pin == 3 or pin == 4): #Toggle garage door
        process = subprocess.call(cmd3, stdout=subprocess.PIPE)
        print process
    else:
        print "Invalid Pin"

ここで、cmd1、cmd2、および cmd3 は実行しようとしているシェル スクリプト ファイルであり、OUTPUT は 1 に等しい定義済みの定数です。ブロックが実際に実行されることはわかっていますが、subprocess.call ステートメントでハングします。

私が実行すると:

subprocess.call(cmd1, stdout=subprocess.PIPE)

Pythonインタープリターではそれ自体で問題なく動作しますが、私のif-elifブロックではハングします。理由はありますか?私は完全に困惑しています...これが機能するようになるまで、今のところvalの値を無視しています。

前もって感謝します!私はPythonにかなり慣れていないので、優しくしてください:)

4

2 に答える 2

1

subprocess.call状態のドキュメント

この関数で stdout=PIPE または stderr=PIPE を使用しないでください。パイプは現在のプロセスで読み取られていないため、OS パイプ バッファーをいっぱいにするのに十分な出力をパイプに生成すると、子プロセスがブロックされる可能性があります。

于 2013-05-23T15:18:41.467 に答える
-1

OUTPUT は、1 に等しい定義済みの定数です。

の場合data[0] == 1ord()通話は失敗します。あなたはそれについて言及していないので、何も起こりません。

私が推測するように、dataがおそらく文字列またはbytes()Unicode のものでありdata[0] == '\x01'、 である場合、2 つのケースが考えられます。

いずれかOUTPUTが really== 1の場合、 のテストはdata[0] == OUTPUTas として失敗し'\x01' != 1、すべてがスキップされます。これが最も可能性の高いシナリオです。

またはOUTPUT == '\x01'、すべてが実行され、最初のifブロックが実行されますが、それは起こらないと言われました。

SSCCEが役に立ちます

于 2013-04-16T13:00:32.827 に答える