pyinstaller中的sys.stdin.readlines()

时间:2019-01-30 14:43:48

标签: python input pyinstaller multiline

在这里,我想创建一个简单的exe程序,使用pyinstaller删除重复的人。

因为我想获得多行输入,所以我使用了:

text = sys.stdin.readlines()

但是,即使它在Jupyter笔记本电脑或spyder上运行良好,但是当我创建并打开其exe文件后,它仅显示黑色窗口而没有显示任何内容。如果我删除该行,我知道它可以工作,但是仅允许单行输入。

另外,我尝试切换这两个,所以先输入,然后输入sys.stdin.readlines():

text = sys.stdin.readlines()
text = input('Type or Paste your text, and press Ctrl + Z.\n\n')

但是,即使允许多行输入,它也只在输入的第一行处理复制功能。

这是我的完整代码。请帮帮我。谢谢

# -*- coding: utf-8 -*-

import re
import sys


def duplication():


    text = sys.stdin.readlines()
    text = input('Type or Paste your text, and press Ctrl + Z.\n\n')
    text = re.split(", |-|  |,", text)


    text = list(filter(None, text)) # fastest

    names = set()
    remove = set()

    for n in text:

        if not n.startswith(("*", "-")):
            n = n.lstrip()
            if n in names:
                remove.add(n)
            elif n not in names:
                names.add(n)

    print(f'\n\nDuplicated person: {(sorted(remove))}\n\nTotal of {len(remove)}is/are removed, Total of {len(names)}is shown.')
    print (sorted(names))




def next_move():
    nxt = input("\n\nWhat do you want to do next?\n   1. Enter another text\n   2. exit\n\n")
    if nxt == '1':
        duplication()
        next_move()
    elif nxt == '2':
        exit()
    else:
        print('Please choose between 1 and 2.')
        next_move()


def overall():
    duplication()
    next_move()


overall()

1 个答案:

答案 0 :(得分:0)

您的输入处理有点麻烦,并且您似乎也没有意识到readlines()方法会返回所有行的列表,直到文件末尾。 因此,input调用将看不到任何输入-这可能使其挂起。

由于您不讨论数据格式,所以我假设

  • '#''-'开头的行应被忽略,空行也应被忽略
  • 每行包含一个名称,可能用空格包围

您的duplication函数应看起来像这样(未经测试):

def duplication():


    print('Type or Paste your text, and press Ctrl + Z.\n\n')
    text = sys.stdin.readlines()    

    names = set()
    remove = set()

    for n in text:

        n = n.strip()
        if n and n.startswith(("*", "-")):
            continue  # straight to next line
        if n in names:
            remove.add(n)
        elif n not in names:  # else: would be just as good!
            names.add(n)

    print(f'\n\nDuplicated person: {(sorted(remove))}\n\nTotal of {len(remove)}is/are removed, Total of {len(names)}is shown.')
    print (sorted(names))