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 是我正在尝试执行的 shell 脚本文件,而 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] == 1,您的ord()呼叫将失败。你没有提到这一点,所以没有类似的事情发生。

如果,如我所想,data可能是一个字符串或一个bytes()或一个 unicode 的东西data[0] == '\x01',有两种可能的情况:

要么OUTPUT是真的== 1,然后测试data[0] == OUTPUT失败,因为'\x01' != 1,整个东西都被跳过了。这是最可能的情况。

或者OUTPUT == '\x01',然后整个东西都执行了,你的第一个if块被执行了,但是你告诉我们这不会发生。

SSCCE会有所帮助

于 2013-04-16T13:00:32.827 回答