【问题标题】:python subprocess.call does not execute in if statementpython subprocess.call不在if语句中执行
【发布时间】:2013-04-16 12:54:52
【问题描述】:

我有这个块:

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相当陌生,所以请温柔:)

【问题讨论】:

    标签: python shell subprocess execute


    【解决方案1】:

    documentation for subprocess.call 状态

    不要在此函数中使用 stdout=PIPE 或 stderr=PIPE。作为管道 当前进程中没有被读取,子进程可能会阻塞 如果它生成足够的输出到管道以填满操作系统管道缓冲区。

    【讨论】:

      【解决方案2】:

      OUTPUT 是一个预定义的常数,等于 1

      如果data[0] == 1,您的ord() 调用将失败。你没有提到这一点,所以没有任何类似的事情发生。

      如果我认为data 可能是字符串或bytes() 或unicode 事物和data[0] == '\x01',则有两种可能的情况:

      如果OUTPUT 真的是== 1,那么data[0] == OUTPUT 的测试就会失败,就像'\x01' != 1 一样,整个东西都被跳过了。这是最可能的情况。

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

      SSCCE 会有所帮助。

      【讨论】:

      • 如果 data[0] 等于 1ord(data[0]) 给出错误 (expected string of length 1, but int found)。但是,如果data[0] 等于"1",则ord(data[0]) 等于49
      • @ExP 这就是为什么我认为data[0] == '\x01'
      • @glglgl 我的错误是'OUTPUT = chr(1)'
      猜你喜欢
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      相关资源
      最近更新 更多