You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyInstaller打包去重exe时sys.stdin.readlines()输入异常问题

解决PyInstaller打包后多行输入与去重功能异常问题

首先咱们梳理下你遇到的核心问题:

  • 用sys.stdin.readlines()获取多行输入时,打包成exe后黑窗口卡住,用户不知道如何结束输入
  • 调整输入顺序后,变量覆盖导致去重只处理了一行内容
  • 移除sys.stdin.readlines()后只能单行输入,不符合需求

问题根源分析

  1. 变量覆盖:你之前的代码里先执行了text = sys.stdin.readlines(),紧接着又用text = input(...)把这个变量重新赋值了,导致之前读取的多行内容完全没被用到——这就是去重只处理第一行的直接原因。
  2. 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()

代码修改说明

  1. 多行输入逻辑:用循环读取每一行输入,直到用户输入空行(或按Ctrl+Z),用户能明确知道如何结束输入,避免exe窗口卡住的问题。
  2. 避免变量覆盖:不再用input()覆盖之前的输入内容,而是把所有行合并后统一处理,确保所有输入都被纳入去重逻辑。
  3. 语法与格式修正:原代码中len(remove)和is/are之间缺少空格,导致输出格式错误,现已修正;同时用while True替代递归调用next_move(),避免多次递归可能引发的栈溢出问题。

PyInstaller打包建议

如果想保留控制台窗口(因为需要输入),打包命令可以是:

pyinstaller --onefile your_script_name.py

如果想要无黑窗口的图形界面版本,需要额外引入tkinter等库做输入框,但这样会增加复杂度,建议先保留控制台版本满足需求。

内容的提问来源于stack exchange,提问作者Yun Tae Hwang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:12:28