sys.stdin.readlines () в pyinstaller - PullRequest
0 голосов
/ 30 января 2019

Здесь я хочу создать простую exe-программу, которая удаляет дублирующихся людей с помощью pyinstaller.

Поскольку я хочу получить многострочные входные данные, я использовал:

text = sys.stdin.readlines()

, но хотяон хорошо работает на ноутбуке или шпионе Jupyter, после того, как я создаю и открываю его исполняемый файл, он не показывает ничего, кроме черного окна.если я удалю эту строку, я знаю, что она работает, но будет разрешен только однострочный ввод.

Кроме того, я пытаюсь переключить эти две строки, поэтому сначала введите 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 голосов
/ 30 января 2019

Ваша обработка ввода немного не в порядке, и вы также не понимаете, что метод 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))
...