我正在尝试创建一个程序来轻松处理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一台机器而不会让我的主程序冻结?
docs说os.system()
返回你调用的命令返回的值,因此阻止你的程序直到它退出。
他们还声明你应该使用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
(和stderr
和stdin
)参数:
有效值为PIPE,DEVNULL,现有文件描述符(正整数),现有文件对象和无。 PIPE表示应该创建一个新的子管道。 DEVNULL表示将使用特殊文件os.devnull。使用默认设置None,不会发生重定向;子项的文件句柄将从父项继承。 - docs on subproces.Popen,如果你向下滚动
如果要获取退出代码,请使用myPopenProcess.poll()
。