我正在尝试创建一个程序来轻松处理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操作而不会冻结主程序?
答案 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
(以及stderr
和stdin
)参数:
有效值为PIPE,DEVNULL,现有文件描述符(正整数),现有文件对象和无。 PIPE指示应创建到子级的新管道。 DEVNULL表示将使用特殊文件os.devnull。使用默认设置无,将不会发生重定向。子文件的句柄将从父文件继承。
-docs on subproces.Popen,如果您向下滚动
如果要获取退出代码,请使用myPopenProcess.poll()
。