Python变量错误 - 赋值前的引用

时间:2017-01-21 11:09:41

标签: python python-3.x sockets

我编写了一个获取服务器信息的程序。但是,程序说在分配之前引用了leng。我该如何防止这种情况?

程序首先扫描开放端口。然后它连接到它找到的第一个开放端口。然后它获取有关服务器的信息。然后程序获取程序的IP地址,最后关闭连接。

import socket

VER = None

portlist = [21,22,25,80,110,443]

ports_test = [21,22,25,80,110,443]

length = 0

leng = 0

siteORip = input("input either a site <eg:www.anysite.com> or an ip address<eg:123.45.67.890>>")

def get_ban():
    print("[CONNECTING>]Establishing connection...")
    while True:
        try:
            port = portlist.pop(0)
            s = socket.socket()
            socket.setdefaulttimeout(5)
            s.connect((siteORip,port))
            s.send("x".encode())
            data = s.recv(1024)
            print("[SERVER BANNER>]",data)
            break
        except:
            s.close()
            length = length + 1
            if length == 6:
                print("[ERROR>]Failed to connect")
                break
            else:
                continue

def get_info():
    try:
        info = socket.gethostbyaddr(siteORip)
        print("[SERVER INFO:([HOST,ADDITIONAL HOST,IP ADDRESS])>]",info)
    except:
        print("[ERROR>]Unknown error retrieving server info")

def get_ip():
    try:
        IP = socket.gethostbyname(siteORip)
    except:
        IP = socket.gethostbyname(siteORip)
    try:
        print("[IP ADDRESS>]",IP)
    except:
        print("[ERROR>]Unable to access IP")
    VER = 1
    s.close()

def ports_open():
    while True:
        try:
            for x in ports_test:
                s = socket.socket()
                socket.setdefaulttimeout(5)
                s.connect((siteORip,x))
                print("[TESTING...>]Port",x,"is open")
                s.close()
        except:
            print("[TESTING...>]Port",x,"is closed")
            s.close()
            leng = leng + 1
            if leng == 6:
                break
            else:
                continue

def main():
    ports_open()
    get_ban()
    get_info()
    get_ip()
    print("[<PROGRAM CONNECTION ENDED>]")

main()      
wait = input("")    

1 个答案:

答案 0 :(得分:1)

嗯,这段代码有很多问题。具体你是谁 遇到的是使用本地引用的全局变量。如 一般来说,最好在函数之间传递数据 明确地,而不是具有可能被更改的全局数据 任何地方。

无论如何......按原样查看代码,你有全局变量 lenglength在顶部定义并初始化。接受它 执行顺序,函数ports_open()尝试更改值 leng。它不会成功,但如果确实如此,那么函数get_ban() 然后会尝试更改length

的值

这失败了,因为(如果我可以被允许拟人化)的时候 Python看到了这些任务,它认为“啊哈!一个新的本地变量是 被分配!哎呀,但它正在使用它的当前值 没有。错误!”

我们需要明确地告诉Python我们没有使用局部变量, 而是全局变量。这是通过插入像这样的行来完成的 在使用全球之前:

global leng

global length

这样做,这个错误就会消失。还有其他错误,但请 试着自己解决这些问题,你会以这种方式学习。