使用PyInstaller打包去重exe时sys.stdin.readlines()输入异常问题
解决PyInstaller打包后多行输入与去重功能异常问题
首先咱们梳理下你遇到的核心问题:
- 用
sys.stdin.readlines()获取多行输入时,打包成exe后黑窗口卡住,用户不知道如何结束输入 - 调整输入顺序后,变量覆盖导致去重只处理了一行内容
- 移除
sys.stdin.readlines()后只能单行输入,不符合需求
问题根源分析
- 变量覆盖:你之前的代码里先执行了
text = sys.stdin.readlines(),紧接着又用text = input(...)把这个变量重新赋值了,导致之前读取的多行内容完全没被用到——这就是去重只处理第一行的直接原因。 - exe环境下的stdin行为:在IDE里,
sys.stdin.readlines()会等待你输入完所有内容后按特定键结束(比如Ctrl+Z),但打包成exe后,黑窗口没有明确提示,用户不知道该如何触发输入结束,看起来就像程序卡住了。
修正后的代码方案
我们可以修改输入逻辑,让用户清晰知道如何结束多行输入(比如提示输入空行结束),同时避免变量覆盖,确保所有输入内容都被处理。另外优化了去重逻辑的细节:
# -*- coding: utf-8 -*- import re import sys def duplication(): print('Type or Paste your text line by line, enter an empty line to finish.\n') # 收集多行输入,直到空行或Ctrl+Z lines = [] while True: try: line = input() if not line: # 空行结束输入 break lines.append(line) except EOFError: # 兼容Ctrl+Z结束输入的情况 break # 合并所有行并分割成人员列表 text = ' '.join(lines) # 保留原分割规则:逗号加空格、横杠、空格、逗号 text = re.split(r", |-| |,", text) text = list(filter(None, text)) # 过滤空字符串 names = set() remove = set() for n in text: # 跳过以*或-开头的项 if not n.startswith(("*", "-")): n = n.lstrip() # 去除左侧多余空格 if n in names: remove.add(n) else: names.add(n) # 修正原代码的格式错误,优化输出可读性 print(f'\n\nDuplicated person: {sorted(remove)}') print(f'Total of {len(remove)} is/are removed, Total of {len(names)} is shown.') print(sorted(names)) def next_move(): while True: nxt = input("\n\nWhat do you want to do next?\n 1. Enter another text\n 2. exit\n\n") if nxt == '1': duplication() elif nxt == '2': print('Exiting...') sys.exit() else: print('Please choose between 1 and 2.') def overall(): duplication() next_move() if __name__ == "__main__": overall()
代码修改说明
- 多行输入逻辑:用循环读取每一行输入,直到用户输入空行(或按Ctrl+Z),用户能明确知道如何结束输入,避免exe窗口卡住的问题。
- 避免变量覆盖:不再用
input()覆盖之前的输入内容,而是把所有行合并后统一处理,确保所有输入都被纳入去重逻辑。 - 语法与格式修正:原代码中
len(remove)和is/are之间缺少空格,导致输出格式错误,现已修正;同时用while True替代递归调用next_move(),避免多次递归可能引发的栈溢出问题。
PyInstaller打包建议
如果想保留控制台窗口(因为需要输入),打包命令可以是:
pyinstaller --onefile your_script_name.py
如果想要无黑窗口的图形界面版本,需要额外引入tkinter等库做输入框,但这样会增加复杂度,建议先保留控制台版本满足需求。
内容的提问来源于stack exchange,提问作者Yun Tae Hwang
相关产品推荐
相关产品推荐

