Python多线程端口扫描器报错:serverIp为意外关键字参数
解决多线程端口扫描器的关键字参数报错问题
嘿,这个问题其实是你在创建线程时用错了threading.Thread的参数规则啦!
问题原因拆解
你写的这行代码:
t = threading.Thread(serverIp = threading)
完全不符合线程创建的正确逻辑:
threading.Thread的初始化参数里根本没有serverIp这个关键字参数,所以Python解释器会直接报错,说这是意外的关键字参数。- 你把
threading(模块本身)赋值给这个不存在的参数,逻辑上也完全不对——创建线程的核心是指定这个线程要执行的函数,而不是传服务器IP或者模块本身。
正确的思路是:线程要执行的是你定义的threader函数,所以需要通过target参数把这个函数传给threading.Thread;至于serverIp,它已经是全局变量,threader和pscan函数都能直接访问到,不需要在创建线程时额外传递。
修正后的完整代码
import socket import threading from Queue import Queue # 替换原有的通配导入,更清晰 print_lock = threading.Lock() serverIp = socket.gethostbyname('www.google.com') def pscan(port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((serverIp, port)) with print_lock: print('Port %d is open' %(port)) s.close() except: pass def threader(): while True: worker = q.get() pscan(worker) q.task_done() q = Queue() for x in range(30): # 修正线程创建的核心代码:指定要执行的目标函数 t = threading.Thread(target=threader) t.daemon = True t.start() for worker in range(1, 101): q.put(worker) q.join()
另外补充个小细节:原代码里的from Queue import *可以改成from Queue import Queue,这样能避免导入不必要的内容,让代码更简洁可控。
内容的提问来源于stack exchange,提问作者user9570858
相关产品推荐
相关产品推荐

