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

时间:2019-02-11 10:40:19

标签: python python-os

我正在尝试创建一个程序来轻松处理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操作而不会冻结主程序?

3 个答案:

答案 0 :(得分:2)

docs的状态为os.system()返回您所调用的命令返回的值,因此将程序阻塞直到退出。

他们还指出,您应该改用subprocess module

答案 1 :(得分: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,以使其在一次或几次尝试后停止。

答案 2 :(得分:0)

如蒂姆·皮茨克(Tim Pietzcker)的回答所述,强烈建议使用subprocess,而不是os.system(及其他)。

要将新过程与脚本分开,请使用subprocess.Popen。您应该将输出正常打印到sys.stdout中。如果您想要更复杂的内容(例如,仅在某些更改时打印某些内容),则可以设置stdout(以及stderrstdin)参数:

  

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

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