Запуск консольного окна в фоновом режиме для GUI с использованием tkinter на Windows 10 - PullRequest
0 голосов
/ 20 апреля 2020

Итак, у меня есть GUI, который я сделал с помощью tkinter, и все работает хорошо. Он подключается к серверам и отправляет команды для Linux или Windows. Я пошел дальше и использовал pyinstaller для создания оконного GUI без консоли, и когда я пытаюсь использовать специфическую c функцию для отправки Windows команд, это не удастся. Если я создаю GUI с консолью, которая появляется до GUI, она работает как шарм. Я пытаюсь понять, как заставить GUI работать с консолью, невидимой для пользователя.

Часть моего кода, которая имеет проблему, вращается вокруг подпроцесса. Чтобы избавить вас от 400+ строк кода, которые я написал, я предоставляю специальный код c, в котором есть проблемы. Вот фрагмент:

def rcmd_in(server):
    import subprocess as sp
    for i in command_list:
        result = sp.run(['C:/"Path to executable"/rcmd.exe', '\\\\' + server, i],
                 universal_newlines=True, stdout=sp.PIPE, stderr=sp.STDOUT)
        print(result.stdout)

Аргумент 'server' передается из другой функции, которая вызывает 'rcmd_in', а 'command_list' является изменяемым списком, созданным в root кода, доступном для все функции.

Теперь, я сделал мою должную осмотрительность. Я просмотрел несколько запросов и предложил редактировать мой код, который пытается выполнить мой код с этой невидимой консолью, найденной с использованием информации по этой ссылке: recipe-subprocess . Вот как выглядит редактирование:

def rcmd_in(server):
    import subprocess as sp
    import os, os.path
    si = sp.STARTUPINFO()
    si.dwFlags |= sp.STARTF_USESHOWWINDOW
    for i in command_list:
        result = sp.run(['C:/"Path to executable"/rcmd.exe', '\\\\' + server, i],
                       universal_newlines=True, stdin=sp.PIPE, stdout=sp.PIPE, 
                       stderr=sp.STDOUT, startupinfo=si, env=os.environ)
        print(result.stdout)

Проблема, с которой я столкнулся сейчас, заключается в том, что появляется ошибка «Ошибка: 8 - Внутренняя ошибка -109». Позвольте мне добавить, что я пытался использовать функции 'call ()', 'Popen ()' и другие, но, похоже, работает только 'run ()'.

Я достиг точки, когда мой мозг болит, и я можете использовать некоторую помощь. Какие-либо предложения? Как всегда я всегда полон чьей-либо помощи. Заранее спасибо!

1 Ответ

0 голосов
/ 21 апреля 2020

Я понял это, и это заняло у меня всего 5 дней! : D

Похоже, причина сбоя функции зависит от того, как Windows обрабатывает стандартный ввод. Я нашел сообщение , которое помогло мне отредактировать код для работы с pyinstaller -w (--noconsole). Вот обновленный код:

def rcmd_in(server):
    import subprocess as sp
    si = sp.STARTUPINFO()
    si.dwFlags |= sp.STARTF_USESHOWWINDOW
    for i in command_list:
        result = sp.Popen(['C:/"Path to executable"/rcmd.exe', '\\\\' + server, i],
                       universal_newlines=True, stdin=sp.PIPE, stdout=sp.PIPE, 
                       stderr=sp.PIPE, startupinfo=si)
        print(result.stdout.read())

Обратите внимание на изменение функций run () на Popen (). Функция run () не будет работать с оператором print в конце. Кроме того, для тех из вас, кому любопытно, переменная 'si', которую я создал, запрещает 'подпроцессу' открывать консоль при запуске при использовании GUI. Я надеюсь, что это станет полезным для тех, кто борется с этим. Приветствия

...