为什么 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
(以及 stderr
和 stdin
)参数:
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()
。
我正在尝试创建一个程序来轻松处理 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
(以及 stderr
和 stdin
)参数:
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()
。