You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:50:27