gpt4 book ai didi

python - 线程子进程的奇怪输出

转载 作者:行者123 更新时间:2023-12-01 05:21:12 26 4
gpt4 key购买 nike

感谢您花时间查看此内容,我们将不胜感激!

我试图通过 ping 名为 ips 的 IP 地址列表来获取一些网络统计信息。然而我遇到的问题是我的输出是一个包含几个“无”的列表。在实现线程来运行子进程命令之前,下面显示的输出是一系列数字。如果有人可以看一下我的源代码并阐明这个问题,我将非常感激!

提前谢谢您!

import subprocess
import re
import threading
from multiprocessing import Pool, Lock
from multiprocessing.dummy import Pool as ThreadPool



def get_ips():

# Fill empty list with IP address
ips = []
with open('C:\Python26\ARPips.prn','r')as f:
for line in f:
line = line[:-1]
if line != "end":
ips.append(line)
return ips

def ping(pingArgs):


lock = Lock()
lock.acquire()

# Ping with "pingArgs" as the arguments
ping = subprocess.Popen(pingArgs,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
shell=True)

# Get and parse output
out = ping.communicate()
out = ''.join((out))

lost = re.findall(r"Lost = (\d+)", out)
minimum = re.findall(r"Minimum = (\d+)", out)
maximum = re.findall(r"Maximum = (\d+)", out)
avg = re.findall(r"Average = (\d+)", out)
no = re.findall(r"Sent = (\d+)", out)

# Change output to integers
lost = [int(x) for x in lost]
minimum = [int(x) for x in minimum]
maximum = [int(x) for x in maximum]
avg = [int(x) for x in avg]
no = [int(x) for x in no]



print "%s \t \t %s \t \t%s \t \t %s \t \t%s" % (no, lost, maximum, minimum, avg)
lock.release()

def main():


# grab IP address list
ips = get_ips()

# Declare global variables
global position, newIP, pingArgs

position = 0
newIP = ips[position]
position += 1
pingArgs = ["ping", "-n", "1", "-l", "1", "-w", "100", newIP]


# Header for output
print "Packets \t loss(%) \t Max(ms) \t Min(ms) \t Average(ms)"

# Instantiate Pool objects, and set size of pool
pool = Pool(processes=12)


#Ping ips in own threads and return the results
result = pool.map(ping, ips)


# Close the pool and wait for work to finish
pool.close()
pool.join()

# print the results
print result

if __name__ == '__main__':
main()
print get_ips()

输出如下所示:

Packets      loss(%)     Max(ms)     Min(ms)     Average(ms)
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
['10.10.10.1', '10.10.10.41', '10.10.10.42', '10.10.10.43', '10.10.10.49', '10.10.10.51', '10.10.10.61', '10.10.10.71', '10.10.10.91', '10.10.10.92', '10.10.10.201', '10.10.10.205', '10.10.10.208', '10.10.10.209', '10.10.10.213', '10.10.10.214']

Process finished with exit code 0

最佳答案

The problem i'm having however is that my output is a list containing several 'None's'

Noneprint result 生成,其中 result = pool.map(ping, ips) 因为 ping() 函数不返回任何内容(这意味着它在 Python 中返回 None)。

Before implementing threads to run the sub-process commands, the output shown below was a series of numbers.

您正在将 IP 地址传递给 Popen(),而不是要运行的完整 ping 命令。

您正在定义未在任何地方使用的全局 pingArgs(ping() 中的本地 pingArgs 会掩盖它)。您可以将 pool.map 替换为内置 map 调用,该调用在同一进程和同一线程中创建结果列表,以查看结果是否相同(正则表达式执行此操作)不匹配)并且该错误与线程/进程无关。

本地 lock = Lock() 没用。

以下是解决上述问题的代码:

#!/usr/bin/env python
import re
from multiprocessing.dummy import Pool # use threads
from subprocess import Popen, PIPE

def get_ips(filename):
ips = []
with open(filename) as f:
for line in f:
line = line.strip()
if line and line != "end":
ips.append(line)
return ips

def ping(ip):
cmd = ["ping", "-n", "1", "-l", "1", "-w", "100", ip]
ping = Popen(cmd, stdout=PIPE, stderr=PIPE)

# Get and parse output
output, err = ping.communicate()
out = ''.join([output, err])

lost = re.findall(r"Lost = (\d+)", out)
minimum = re.findall(r"Minimum = (\d+)", out)
maximum = re.findall(r"Maximum = (\d+)", out)
avg = re.findall(r"Average = (\d+)", out)
no = re.findall(r"Sent = (\d+)", out)

# Change output to integers
lost = [int(x) for x in lost]
minimum = [int(x) for x in minimum]
maximum = [int(x) for x in maximum]
avg = [int(x) for x in avg]
no = [int(x) for x in no]

return "%s \t \t %s \t \t%s \t \t %s \t \t%s" % (
no, lost, maximum, minimum, avg)

def main():
# grab IP address list
ips = get_ips(r'C:\Python26\ARPips.prn')

# Header for output
print "Packets \t loss(%) \t Max(ms) \t Min(ms) \t Average(ms)"

# Instantiate Pool objects, and set size of pool
pool = Pool(processes=12)

#Ping ips in own threads and return the results
results = pool.map(ping, ips)

# Close the pool and wait for work to finish
pool.close()
pool.join()

# print the results
print "\n".join(results)

if __name__ == '__main__':
main()

关于python - 线程子进程的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22330003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com