【问题标题】:How do I skip a subprocess until it finishes如何跳过子进程直到它完成
【发布时间】:2014-11-18 22:42:21
【问题描述】:

我的程序循环通过这个返回服务器延迟的子进程。

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
latency = subprocess.Popen(["ping.exe", "141.101.115.212"], 
                           stdout=subprocess.PIPE, 
                           startupinfo=startupinfo)
latency = str(x.communicate()[0])

问题是程序会在循环中暂停以允许子进程完成。有没有办法跳过这个子进程,直到它完成,所以我可以继续循环?

编辑

我不能只等待子进程完成的原因是因为我需要能够单击并拖动显示延迟的窗口。如果子进程没有完成,窗口将不会移动。这会产生滞后效应。

class WindowDraggable():

    def __init__(self, label):
        self.label = label
        label.bind('<ButtonPress-1>', self.StartMove)
        label.bind('<ButtonRelease-1>', self.StopMove)
        label.bind('<B1-Motion>', self.OnMotion)

    def StartMove(self, event):
        self.x = event.x
        self.y = event.y

    def StopMove(self, event):
        self.x = None
        self.y = None

    def OnMotion(self, event):
        x = (event.x_root - self.x - self.label.winfo_rootx() + self.label.winfo_rootx())
        y = (event.y_root - self.y - self.label.winfo_rooty() + self.label.winfo_rooty())
        root.geometry("+%s+%s" % (x, y))

【问题讨论】:

  • 结果是否与您的其余代码相关?
  • @PadraicCunningham 我正在循环浏览这段代码,以便刷新我在窗口上显示的延迟。问题是当我的程序正在等待子进程完成时,我无法拖动窗口。子流程正在产生滞后效应。你明白我的意思吗?
  • 我想是的,ping 的结果稍后会在您的程序中用作输出?
  • @PadraicCunningham 窗口上显示的 ping 会在子进程提供新的 ping 后立即刷新。
  • 使用线程与子进程通信,使用队列将结果数据传递给主线程。 @PadraicCunningham 我怀疑你已经理解了这个问题,OP 正在阻止他的 GUI 线程,因此他的窗口变得没有响应。

标签: python python-3.x


【解决方案1】:

latency 绑定到subprocess 命令和转换后的输出。虽然您可以使用 subprocess 命令:

latency.poll()

检查它是否已经完成。欲了解更多信息,check the docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多