python subprocess.Popen运行 iperf3 失败,没有反应

文章描述了一个Python脚本尝试使用`subprocess`模块启动iperf3服务进行网络监控,但遇到了问题。在`rr`函数中,服务未能成功启动,而在`rr1`函数中,由于缺失cygwin1.dll组件,导致错误代码-1073741515。解决方案是将cygwin1.dll添加到iperf3可执行文件的同一目录下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
import subprocess
import threading
import time

def rr():
    s=subprocess.Popen(["iperf3.exe","-s -p 5005"], stdout=subprocess.PIPE, universal_newlines=True)
    time.sleep(0.5)
    print(s.stdout.readline())


def rr1():
    print(os.system('iperf3.exe -s -p 5005'))

threading.Thread(target=rr,).start()
time.sleep(10)

threading.Thread(target=rr1,).start()    #-1073741515
time.sleep(10)    

运行rr后, cmd中输入netstat -aon | findstr "[^0-9]5005[^0-9]" 查看iperf服务是否开启,发现未开启。python中也没有回显。

运行rr1,返回错误代码-1073741515,百度是缺失组件。

发现是缺少了cygwin1.dll组件,把该组件放到iperf3.exe同目录下即可

import subprocess import time import argparse # 配置参数 IPERF_SERVER_IP = "192.168.1.100" # iperf3 服务器 IP IPERF_SERVER_PORT = 5201 # iperf3 服务器端口 TEST_DURATION = 10 # 测试时长(秒) BANDWIDTH = "1M" # 带宽限制 LOG_FILE = "throughput_test.log" # 日志文件 def start_iperf_server(): """启动 iperf3 服务器""" command = ["iperf3", "-s", "-p", str(IPERF_SERVER_PORT)] server_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print(f"iperf3 服务器已启动,监听端口 {IPERF_SERVER_PORT}...") return server_process def run_iperf_client(protocol="tcp"): """运行 iperf3 客户端测试吞吐量""" if protocol == "udp": command = [ "iperf3", "-c", IPERF_SERVER_IP, "-p", str(IPERF_SERVER_PORT), "-u", "-b", BANDWIDTH, "-t", str(TEST_DURATION), "--json" ] else: command = [ "iperf3", "-c", IPERF_SERVER_IP, "-p", str(IPERF_SERVER_PORT), "-t", str(TEST_DURATION), "--json" ] print(f"开始 {protocol.upper()} 吞吐量测试...") result = subprocess.run(command, capture_output=True, text=True) return result.stdout def save_results_to_log(data, protocol): """将测试结果保存到日志文件""" with open(LOG_FILE, "a") as log: log.write(f"{time.ctime()} - {protocol.upper()} 测试结果:\n") log.write(data + "\n\n") print(f"{protocol.upper()} 测试结果已保存到 {LOG_FILE}") def main(): # 解析命令行参数 parser = argparse.ArgumentParser(description="网络吞吐量测试脚本") parser.add_argument("--protocol", type=str, default="tcp", choices=["tcp", "udp"], help="测试协议 (tcp 或 udp)") args = parser.parse_args() # 启动 iperf3 服务器 server_process = start_iperf_server() # 等待服务器启动 time.sleep(2) try: # 运行 iperf3 客户端测试 test_result = run_iperf_client(args.protocol) print(test_result) # 打印测试结果 # 保存测试结果到日志文件 save_results_to_log(test_result, args.protocol) finally: # 关闭 iperf3 服务器 server_process.terminate() print("iperf3 服务器已关闭。") if __name__ == "__main__": main() 逐行解释这个代码
04-02
### 实现Python实时读取iperf测试速率 为了实现通过Python代码来实时获取和处理`iperf`传输速率的数据,可以采用子进程调用的方式执行`iperf`命令并解析其输出。下面展示了一种方法,该方法利用了Python标准库中的`subprocess`模块来启动`iperf`客户端,并捕获其实时输出。 ```python import subprocess import re def run_iperf(server_address, byte_count): command = ['iperf', '-c', server_address, '-n', str(byte_count)] with subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) as process: for line in iter(process.stdout.readline, ''): yield parse_line(line) def parse_line(line): match = re.search(r'(\d+\.\d+) Mbits/sec', line) if not match: return None throughput = float(match.group(1)) return {'throughput': throughput} ``` 上述函数定义了一个名为`run_iperf`的过程,它接受服务器地址以及要发送的字节数作为参数[^1]。此过程会创建一个新的子进程用于运行`iperf`命令并向指定的目标IP地址发起连接请求。每当接收到新的输出行时,这些行会被传递给另一个辅助函数`parse_line`来进行正则表达式的匹配查找吞吐量数值[^2]。 对于每一行输出,如果找到了表示Mbps单位下的带宽值,则将其转换成浮点数形式返回;如果没有找到相应的模式,则返回None。这样就可以逐行地获得由`iperf`报告出来的瞬时速度信息。 请注意,在实际应用中可能还需要考虑更多细节问题,比如错误处理机制、多线程支持或是更复杂的日志记录功能等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值