无法让 Python 附加工作 - 列表返回空

问题描述 投票:0回答:1

我正在将类调用/导入到主脚本中。一切正常,除非我尝试将 .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]”

python list append
1个回答
0
投票

所以我通过在 __ 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,并从队列中弹出项目....

© www.soinside.com 2019 - 2024. All rights reserved.