为何直接传字符串参数有效,传变量却无效?线程登录代码求助
问题排查与解决方案
我一眼就发现了问题所在——你用readlines()读取密码列表时,每一行的末尾都会带上换行符\n,哪怕你把它转成str类型,这个换行符依然会留在字符串里。这就导致你传入的密码实际上是"正确密码\n",而非你预期的"正确密码",自然无法通过登录验证。而直接写死密码字符串的时候,你不会额外加换行符,所以能正常登录。
验证问题的小技巧
你可以把打印word的代码改成下面这样,直观看到字符串的实际内容:
print(repr(word)) # repr会显示字符串的原始形态,包括隐藏的换行符
比如正确密码是123456的话,打印结果会是'123456\n',一眼就能看到多余的换行符。
修复方案
只需要在读取每行密码时,去掉末尾的换行符即可,推荐两种常用方式:
- 用
strip()去掉首尾所有空白字符(包括换行、空格、制表符等):
适合密码本身没有首尾空格的场景,通用性最强。word = pw_line[i].strip() - 用
rstrip('\n')只移除末尾的换行符:
适合密码本身包含首尾空格的情况,避免误删有效字符。word = pw_line[i].rstrip('\n')
修改后的核心代码片段
把循环里的word = str(pw_line[i])替换成上面任意一种写法即可:
for i in range(len(pw_linex)): word = pw_line[i].strip() # 替换为这行代码 print(repr(word)) # 验证换行符已被移除 t = threading.Thread(target=checkfor, args=[word]) t.start() threads.append(t)
另外还有个小优化点:你可以直接遍历pw_linex,让代码更简洁:
for word in pw_linex: word = word.strip() print(repr(word)) t = threading.Thread(target=checkfor, args=[word]) t.start() threads.append(t)
这样修改后,程序就能正确识别列表里的目标密码了。
内容的提问来源于stack exchange,提问作者Lily H.
相关产品推荐
相关产品推荐

