我有这个块:
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很新,所以请温柔:)
答案 0 :(得分:1)
documentation for subprocess.call州
不要将stdout = PIPE或stderr = PIPE与此功能一起使用。作为管道 在当前进程中没有被读取,子进程可能会阻塞 如果它为管道生成足够的输出以填充OS管道缓冲区。
答案 1 :(得分:-1)
OUTPUT是一个等于1的预定义常量
如果data[0] == 1
,您的ord()
来电将失败。你没有提到这一点,所以没有任何相似之处。
如果我假设data
可能是字符串或bytes()
或unicode事件而data[0] == '\x01'
,则有两种可能的情况:
OUTPUT
确实是== 1
,然后data[0] == OUTPUT
的测试失败,为'\x01' != 1
,并且会跳过整个内容。这是最可能的情况。
或OUTPUT == '\x01'
,然后执行整个内容并执行您的第一个if
块,但是您告诉我们这不会发生。
SSCCE会有所帮助。