【问题标题】:Process with subprocess module never stops running带有子进程模块的进程永远不会停止运行
【发布时间】:2019-08-07 12:48:53
【问题描述】:

我刚刚开始在 Python 3 上使用 subprocess 模块,但我不知道它是如何工作的。 这是我编写的用于打开和关闭 USB 端口的函数。它可以工作,但是它会无限期地运行,我不能做任何其他事情,直到用 Ctrl+C 强制它停止。打印语句也永远不会被调用:

def usb_power_toggle(s):
    power_off, power_on = "echo '1-1' |sudo tee sys/bus/usb/drivers/usb/unbind", "echo '1-1' |sudo tee /sys/bus/usb/drivers/usb/bind"
    if s == "off":
        subprocess.run(power_off, shell = True)
        print("USB power off!")
    elif s == "on":
        subprocess.run(power_on, shell = True)
        print("USB power on!")
    else:
        raise ValueError

有人知道问题出在哪里吗?你能告诉我如何在它完成它应该做的事情后关闭它吗?

【问题讨论】:

  • 我无法复制。我只是使用了一个简单的命令 - "echo 'off'""echo 'on'" - 函数中的其他所有内容都相同;并且它起作用了,因此您尝试运行的命令中必须有一些东西挂起
  • 将子进程的daemon 标志设置为True 以允许主进程退出,即使它仍在运行。
  • @martineau ?? TypeError: __init__() got an unexpected keyword argument 'daemon'
  • 您需要显式创建一个Process 实例来设置它。另请注意,__init__()daemon 关键字参数直到 3.3 版才添加,因此您需要在早期版本中创建后自己手动设置该属性。我通常这样做是为了更好地向后兼容。
  • @martineau - subprocess 我想,不是multiprocessing.Process

标签: python python-3.x subprocess


【解决方案1】:

在尝试了一些不同的事情后,我终于让它工作了。 我必须承认我不明白为什么会这样,或者为什么我之前遇到过这个问题。如果有人知道这一点并愿意澄清,我将不胜感激。

from subprocess import STDOUT, check_output

def call_cmd(cmd):
    try:
        check_output(cmd, stderr=STDOUT, timeout=1, shell = True)
    except subprocess.CalledProcessError:
        print("Exit status 1")

def usb_power_toggle(s):
    power_off, power_on = "echo '1-1' |sudo tee /sys/bus/usb/drivers/usb/unbind", \
    "echo '1-1' |sudo tee /sys/bus/usb/drivers/usb/bind"
    if s == "off":
        call_cmd(power_off)
        print("USB power off")
    elif s == "on":
        call_cmd(power_on)
        print("USB power on")
    else:
        raise ValueError

【讨论】:

    【解决方案2】:

    只需使用 popen

        def usb_power_toggle(s):
           from os import popen
           power_off, power_on = "echo '1-1' |sudo tee sys/bus/usb/drivers/usb/unbind", "echo '1-1' |sudo tee /sys/bus/usb/drivers/usb/bind"
           if s == "off":
               popen(power_off)
               print("USB power off!")
           elif s == "on":
               popen(power_on)
               print("USB power on!")
           else:
               raise ValueErro
    

    【讨论】:

    • 不幸的是,这不起作用。进程终止,但 USB 未打开/关闭;什么都没有发生。
    猜你喜欢
    • 2013-09-09
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多