Windows网络测速工具代码优化及变量作用域问题咨询
Windows网络测速工具代码优化与变量作用域修复
问题概述
我开发了一款Windows平台的网络测速工具,具备以下功能:打印当前日期时间、查询已连接SSID、初始化speedtest模块、扫描可用服务器、选择最优服务器、执行Ping测试、下载/上传测速、屏幕显示结果并写入TXT文件留存,同时需要统计各函数运行时长及总执行时长。目前代码在函数封装后频繁出现局部变量无法访问的问题(例如initialise函数无法调用其他函数内的变量),无函数封装时运行正常,Android平台去掉find_ssid()后也能正常运行。现需优化代码结构、规范函数定义,同时为后续开发配套手机应用做准备。
原代码
import speedtest from datetime import datetime import subprocess import re import time def main(): def date(): dt_now = datetime.now() dtn = dt_now.strftime("%a %d-%m-%Y, %H:%M:%S%p") return dtn print(date()) def find_ssid(): stt = time.time() cdop = subprocess.run(["netsh", "WLAN", "show", "interfaces"], capture_output=True).stdout.decode() ssid = (re.findall("SSID : (.*)\\r", cdop)) for char in ssid: ssid = f"Network Name: {char} \n" sid = time.time() - stt print(f'SSID found in: {sid:.2f}s') print(ssid) find_ssid() def initialise(): print("Initialising network speed test... ") st = speedtest.Speedtest() print("Network speed test active.") sta = time.time() - stt print(f'Speed test activation time: {sta - sid:.2f}s') def scan_servers(): print("Scanning for available servers...") st.get_servers() print("Found available servers.") sft = time.time() - stt print(f'Servers found in: {sft - sta:.2f}s') def best_server(): print("Choosing best server...") bserv = st.get_best_server() print(f"Best server is: {bserv['sponsor']} - {bserv['host']} located in {bserv['name']}, {bserv['country']}") bst = time.time() - stt print(f'Best server found in: {bst - sft:.2f}s') def ping_test(): print("Ping testing...") p = st.results.ping ph = f"Ping: {p:.2f}ms" print("Ping test complete.") ptt = time.time() - stt print(f'Ping test completed in: {ptt - bst:.2f}s') def download_speed_test(): print("Download speed testing...") ds = st.download() dsh = f"Download speed: {ds / 1024 / 1024:.2f}mb/s" print("Download speed test complete.") dst = time.time() - stt print(f'Download speed test completed in: {dst - ptt:.2f}s') def upload_speed_test(): print("Upload speed testing...") us = st.upload() ust = time.time() - stt ush = f"Upload speed: {us / 1024 / 1024:.2f}mb/s \n" print("Upload speed test complete. \n") print(f'Upload speed test completed in: {ust - dst:.2f}s') def result(): print("Speed test results are: \n") print(ssid) print(ph) print(dsh) print(ush) ttn = datetime.now() fdt = ttn.strftime("%a %d-%m-%Y, %H:%M:%S%p") tt = time.time() - stt print(f"Start Time: {dtn}") print(f"Finish Time: {fdt}") print(f'Total execution time: {tt:.2f}s') results = [ssid, ph, dsh, ush, dtn] txt = "Speedtest Results.txt" with open(txt, 'a') as f: f.write("\n") f.write("\n".join(results)) f.write("\n") f.close() main()
优化后的代码
import speedtest from datetime import datetime import subprocess import re import time import sys def get_current_datetime(): """获取格式化的当前时间字符串""" return datetime.now().strftime("%a %d-%m-%Y, %H:%M:%S%p") def find_ssid(): """Windows平台查询当前连接的SSID""" start_time = time.time() try: output = subprocess.run( ["netsh", "WLAN", "show", "interfaces"], capture_output=True, text=True, check=True ).stdout ssid_match = re.search(r"SSID\s+:\s+(.*)\r", output) if ssid_match: ssid = f"Network Name: {ssid_match.group(1)}" else: ssid = "Network Name: No connected WLAN" except (subprocess.CalledProcessError, FileNotFoundError): ssid = "Network Name: SSID query unavailable (non-Windows platform)" elapsed = time.time() - start_time print(f'SSID found in: {elapsed:.2f}s') print(ssid) return ssid def initialize_speedtest(): """初始化speedtest实例""" start_time = time.time() print("Initialising network speed test... ") st = speedtest.Speedtest() print("Network speed test active.") elapsed = time.time() - start_time print(f'Speed test activation time: {elapsed:.2f}s') return st def scan_servers(st): """扫描可用测速服务器""" start_time = time.time() print("Scanning for available servers...") st.get_servers() print("Found available servers.") elapsed = time.time() - start_time print(f'Servers found in: {elapsed:.2f}s') def get_best_server(st): """选择最优测速服务器""" start_time = time.time() print("Choosing best server...") best_serv = st.get_best_server() print(f"Best server is: {best_serv['sponsor']} - {best_serv['host']} located in {best_serv['name']}, {best_serv['country']}") elapsed = time.time() - start_time print(f'Best server found in: {elapsed:.2f}s') def run_ping_test(st): """执行Ping测试并返回结果字符串""" start_time = time.time() print("Ping testing...") ping = st.results.ping ping_result = f"Ping: {ping:.2f}ms" print("Ping test complete.") elapsed = time.time() - start_time print(f'Ping test completed in: {elapsed:.2f}s') return ping_result def run_download_test(st): """执行下载测速并返回结果字符串""" start_time = time.time() print("Download speed testing...") download_speed = st.download() / 1024 / 1024 # 转换为MB/s download_result = f"Download speed: {download_speed:.2f}mb/s" print("Download speed test complete.") elapsed = time.time() - start_time print(f'Download speed test completed in: {elapsed:.2f}s') return download_result def run_upload_test(st): """执行上传测速并返回结果字符串""" start_time = time.time() print("Upload speed testing...") upload_speed = st.upload() / 1024 / 1024 # 转换为MB/s upload_result = f"Upload speed: {upload_speed:.2f}mb/s" print("Upload speed test complete. \n") elapsed = time.time() - start_time print(f'Upload speed test completed in: {elapsed:.2f}s') return upload_result def save_and_display_results(start_datetime, ssid, ping_res, download_res, upload_res): """显示测试结果并写入TXT文件""" finish_datetime = get_current_datetime() total_elapsed = time.time() - start_timestamp print("\nSpeed test results are: ") print(ssid) print(ping_res) print(download_res) print(upload_res) print(f"Start Time: {start_datetime}") print(f"Finish Time: {finish_datetime}") print(f'Total execution time: {total_elapsed:.2f}s') # 写入文件 results_content = [ start_datetime, ssid, ping_res, download_res, upload_res, f"Total execution time: {total_elapsed:.2f}s", finish_datetime ] with open("Speedtest Results.txt", 'a', encoding='utf-8') as f: f.write("\n" + "-"*50 + "\n") f.write("\n".join(results_content)) f.write("\n") if __name__ == "__main__": start_timestamp = time.time() start_datetime = get_current_datetime() print(f"Test started at: {start_datetime}") # 平台适配:Windows平台执行SSID查询,其他平台跳过 ssid = "" if sys.platform.startswith('win32'): ssid = find_ssid() else: ssid = "Network Name: SSID query not supported on this platform" print(ssid) # 执行测速流程 st = initialize_speedtest() scan_servers(st) get_best_server(st) ping_result = run_ping_test(st) download_result = run_download_test(st) upload_result = run_upload_test(st) # 保存并展示结果 save_and_display_results(start_datetime, ssid, ping_result, download_result, upload_result)
关键优化点
- 解决变量作用域问题:将所有嵌套函数改为独立函数,通过参数传递和返回值共享数据,避免跨函数访问局部变量的问题。比如speedtest实例
st通过参数传递给各个测速函数,SSID、测速结果等通过返回值传递给结果处理函数。 - 规范函数职责:每个函数只负责单一功能(如
find_ssid仅处理SSID查询,initialize_speedtest仅初始化测速实例),代码结构更清晰,便于维护和扩展。 - 完善时间统计:每个函数内部独立统计自身耗时,总耗时在main函数中统一计算,避免依赖其他函数的时间变量,逻辑更可靠。
- 多平台适配:通过
sys.platform判断操作系统,Windows平台执行SSID查询,其他平台自动跳过,适配Android等非Windows环境。 - 增强健壮性:为SSID查询添加异常捕获,处理命令执行失败或非Windows平台的情况,避免程序崩溃。
- 优化文件写入:添加分隔线、统一编码,提升结果文件的可读性,同时避免手动关闭文件(
with语句自动处理)。
内容的提问来源于stack exchange,提问作者C4r
相关产品推荐
相关产品推荐

