我正在使用带有线程的 subprocess.Popen 类,但它对我不起作用
问题内容
我有以下文件:
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