我正在将类调用/导入到主脚本中。一切正常,除非我尝试将 .append() 一个 sys.argv[1] 列表添加到主调用类的函数列表中。 我试图将列表和函数移动到 name == main 下和类定义之上。 sys/argv 被映射回一个函数字典,函数应该附加到一个列表中,但是当在 name == main 下和主脚本本身内部打印列表时,列表返回为空。当我打印这个时:
print(function_list.append(out)) 它返回 None,所以我不认为这是在执行。
特别是这段代码:
if __name__ == "__main__":
# functions_list = []
from Connect_Handler import Connect
inlist = sys.argv[1]
outlist = inlist.split(",")
print("This is outlist")
print(outlist)
print(type(outlist))
for i in outlist:
out = functions[i]
print("This is out")
print(out)
print(function_list.append(out))
function_list.append(out)
Connector = Connect()
print(time.perf_counter())
Connector.connect_parser()
print(time.perf_counter())
打印 outlist 返回一个列表,
printing(type(outlists)) 返回一个类“列表”,
打印出来返回一个函数对象,
打印追加函数返回无。
所以它似乎没有附加任何东西。
这是代码块(线程部分可能需要返工,我还没有测试过):
from Hardware_info import HardwareMaintenance
from OSPF import OSPFMaintenance as OSPF
OSPF = OSPF.OSPF_Handler
Hardware = HardwareMaintenance.hardware_handler
functions = {"Hardware": Hardware, "OSPF": OSPF}
thread_pool = Queue()
ip_pool = Queue()
function_list = []
thread_list = []
class Connect:
def __init__(self,):
intake_file = open('ip_list.txt', 'r')
self.json_data = [json.loads(line) for line in intake_file]
pass
def connect_parser(self, inlist=[]):
for data in self.json_data:
ip = data["ip"]
# port = data["port"]
username = data["username"] if data["username"] else ""
password = data["password"] if data["password"] else ""
secret = data["secret"] if "secret" in data else False
device_type = data["device_type"] if data["device_type"] else ""
ip_pool.put(ip)
if data["header"] == "Netmiko":
print("The variables being passed: " + ip, username, password, device_type)
ConnectHandler = netmiko.ConnectHandler(
device_type=device_type,
host=ip,
username=username,
password=password,
port=22,
secret=data["secret"] if "secret" in data else False
)
if ConnectHandler:
try:
ConnectHandler.enable()
except Exception as e:
print("Could not connect to {}".format(ip))
thread_pool.put(ConnectHandler)
looper()
def looper():
while not thread_pool.empty():
conn = thread_pool.get(block=False)
host = ip_pool.get(block=False)
print("host " + host)
print(function_list)
for i in function_list:
print ("This is i inside Looper")
print(i)
res = threading.Thread(target=i, args = (conn, host), daemon=True)
res.start()
print(res.__repr__())
thread_list.append(res)
for i in thread_list:
i.join()
print("This is the threads list")
print(i.__repr__())
if __name__ == "__main__":
# functions_list = []
from Connect_Handler import Connect
inlist = sys.argv[1]
outlist = inlist.split(",")
print("This is outlist")
print(outlist)
print(type(outlist))
for i in outlist:
out = functions[i]
print("This is out")
print(out)
print(function_list.append(out))
function_list.append(out)
Connector = Connect()
print(time.perf_counter())
Connector.connect_parser()
print(time.perf_counter())
同样在上面的looper()函数下:
print("主机" + 主机), 打印(函数列表)
host x.x.x.x 被返回,但也返回一个空列表。
我手动将多个函数添加到类定义上方的列表中,它可以工作,并在大约 23 秒内运行代码,所以我假设甚至线程也可能工作(我稍后会测试更多,我什至意识到我正在按顺序运行我的 ConnectHandler)。
thread_pool = Queue()
ip_pool = Queue()
function_list = [Hardware, OSPF]
thread_list = []
如上 function_list = [Hardware, OSPF],现在整个代码运行。
但是我想从我的 CLI 列表中附加到这个列表,我的 sys.argv[1] 上的拆分正在工作,但附加不是...
有什么改进我的代码的想法吗?
我花了大约 3 个小时来尝试正确附加,但它不起作用:(
另请注意,我正在从 CLI 运行“Connect_Handler.py [Hardware,OSPF]”
所以我通过在 __ main __ 下导入 functions_list 来让它工作。我记得在 python 中学习错误列表引用的课程,但没有意识到我在这种情况下错误地引用了在调用程序/主脚本中声明的列表(事实上我根本没有引用)。
if __name__ == "__main__":
# functions_list = []
from __main__ import function_list
from __main__ import Connect
Connector = Connect()
inlist = sys.argv[1]
outlist = inlist.split(",")
print("This is outlist")
print(outlist)
print(type(outlist))
for i in outlist:
out = functions[i]
print("This is out")
print(out)
function_list.append(out)
print(function_list)
print(time.perf_counter())
Connector.connect_parser()
print(time.perf_counter())
调用 2 个外部类的代码在 19 秒内执行,但是我需要在使用变通方法时稍微修改一下我的线程,因为截至目前,我正在顺序调用我的 ConnectHandler,并从队列中弹出项目....