为什么os.system阻止程序执行?

问题描述 投票:1回答:3

我正在尝试创建一个程序来轻松处理IT请求,我已经创建了一个程序来测试我的网络上的PC是否从列表中处于活动状态。

为此,我编写了以下代码:

self.btn_Ping.clicked.connect(self.ping)

def ping(self):
        hostname = self.listWidget.currentItem().text()
        if hostname:
            os.system("ping " + hostname + " -t")

当我运行它时,我的主程序冻结,直到我关闭ping命令窗口我才能做任何事情。我该怎么办?是否还有其他命令可以用来尝试ping一台机器而不会让我的主程序冻结?

python python-os
3个回答
2
投票

docsos.system()返回你调用的命令返回的值,因此阻止你的程序直到它退出。

他们还声明你应该使用subprocess module代替。


0
投票

来自ping文档:

ping /?

Options:
-t             Ping the specified host until stopped.
               To see statistics and continue - type Control-Break;
               To stop - type Control-C.

因此,通过使用-t,您将等待该计算机停止,并且如果该计算机没有停止,您的Python脚本将永远运行。

正如HyperTrashPanda所提到的,使用另一个参数来启动ping,以便在一次或多次尝试后停止。


0
投票

正如Tim Pietzcker的回答中所提到的,强烈建议使用subprocess而不是os.system(和其他人)。

要将新进程与脚本分开,请使用subprocess.Popen。您应该将输出正常打印到sys.stdout。如果你想要更复杂的东西(例如,只有在某些东西发生变化的情况下打印某些东西),你可以设置stdout(和stderrstdin)参数:

有效值为PIPE,DEVNULL,现有文件描述符(正整数),现有文件对象和无。 PIPE表示应该创建一个新的子管道。 DEVNULL表示将使用特殊文件os.devnull。使用默认设置None,不会发生重定向;子项的文件句柄将从父项继承。 - docs on subproces.Popen,如果你向下滚动

如果要获取退出代码,请使用myPopenProcess.poll()

© www.soinside.com 2019 - 2024. All rights reserved.