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

Why does os.system block program execution?

我正在尝试创建一个程序来轻松处理 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 命令 window。我该怎么办?是否有任何其他命令可以用来尝试 ping 一台机器而不会使我的主程序冻结?

docs 声明 os.system() returns 您调用的命令返回的值,因此会阻塞您的程序,直到它退出。

他们还声明您应该改用 subprocess module

来自 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,以便在尝试一次或几次后停止。

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

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

Valid values are PIPE, DEVNULL, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created. DEVNULL indicates that the special file os.devnull will be used. With the default settings of None, no redirection will occur; the child’s file handles will be inherited from the parent.
-- docs on subproces.Popen, if you scroll down

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