PHP前端开发

我正在使用带有线程的 subprocess.Popen 类,但它对我不起作用

百变鹏仔 1个月前 (01-18) #Python
文章标签 对我
问题内容

我有以下文件:

ping.py:

from utilities.env import packet_cout, ping_time, max_workers_countfrom utilities.cmds import create_ping_cmdfrom subprocess import popen, pipe, devnull, timeoutexpiredfrom re import findallfrom concurrent.futures import threadpoolexecutormax_ping_time = float(packet_cout) * (float(ping_time))ping_cmd = create_ping_cmd()def check_ping_process(ping_process):    ping_result = {}    try:        out = ping_process.communicate(timeout=max_ping_time)[0]        is_successes = findall("ttl", out)        if ping_process.returncode == 0 and is_successes:            return true        else:            return false    except timeoutexpired:        ping_process.kill()        return falsedef ping_ip(ip):    ping_cmd.append(ip)    ping_process = popen(        ping_cmd,        stdout=pipe,        stderr=devnull,        text=true    )    result = check_ping_process(ping_process)    return resultdef ping_ip_list(ip_list):    ping_results = []    with threadpoolexecutor(max_workers=max_workers_count) as executor:        results = executor.map(ping_ip, ip_list)        for ip, result in zip(ip_list, results):            print({ip, result})            ping_results.append({ip, result})    return ping_results

main.py:

from ping import ping_ip_listip_list = [    '192.168.0.100',    '192.168.0.1',    '192.168.0.104',    '192.168.0.124',    '192.168.0.103']def monitor_network_devices(ip_list):    results = ping_ip_list(ip_list)monitor_network_devices(ip_list)

该程序的目标是查明网络设备是否可 ping 通。我正在运行 main.py 文件,它给出了错误的结果。我尝试debug,似乎是线程的问题,但无法解决。

任何帮助将不胜感激


正确答案


一些观察

这样,这是我提出的解决方案

# ping.pyimport loggingimport subprocessfrom concurrent.futures import ThreadPoolExecutorlogging.basicConfig(    level=logging.DEBUG,    format="%(asctime)s | %(levelname)s | %(threadName)-15s | %(funcName)-18s | %(message)s",)def ping_ip(ip):    ping_command = ["ping", "-c1", ip]    logging.debug("Execute command %r", ping_command)    completed_process = subprocess.run(        ping_command,        text=True,        capture_output=True,        check=False,    )    success = completed_process.returncode == 0    logging.debug("%s -> %r", ip, success)    return successdef ping_ip_list(ip_list):    with ThreadPoolExecutor() as executor:        out = dict(zip(ip_list, executor.map(ping_ip, ip_list)))    return out