Как перехватить вывод pyistaller.__main__.run - PullRequest
0 голосов
/ 12 февраля 2020

Я дошел до того, что просто хотел создать внешнюю программу для создания .exe-файлов из файлов Pyhton через PyInstaller.__main__.run, выбрав несколько файлов и отметив их галочками. Но я все еще хотел взглянуть на результаты процесса. И так как они отображаются красным цветом в оболочке Python -IDEs, я подумал, что они были (обрезаны до одной строки) с ошибками, поэтому я попытался переопределить sys.stderr, но это не сработало вообще. Но так как они не являются ни stdoutputs для получения через sys.stdout, я не знаю, как их получить. Поэтому я подумал о двух возможных способах решения этой проблемы, но не знаю, как сделать каждый из них, и ничего не нашел в моем исследовании Google:

a) Кто-то здесь знает решение, как получить эти результаты ( приветствуется)

ИЛИ

b) Мне нужна опция для контроля, находится ли окно вывода оболочки на заднем или переднем плане (или в виде иконки / деиконифицировано).

Заранее спасибо.

1 Ответ

0 голосов
/ 13 февраля 2020

Так как, кажется, никто не получил ответа, я хочу опубликовать решение, о котором я узнал:

import subprocess
from tkinter import *
from threading import Thread

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.rowconfigure(0,weight=1)
        self.columnconfigure(0,weight=1)
        self.text=Text(self)
        self.text.grid(row=0,column=0,sticky=NSEW)
        sby=Scrollbar(self,command=self.text.yview)
        sby.grid(row=0,column=1,sticky=NS)
        sbx=Scrollbar(self,command=self.text.xview,orient=HORIZONTAL)
        sbx.grid(row=1,column=0,sticky=EW)
        self.text.config(yscrollcommand=sby.set,xscrollcommand=sbx.set)
        Button(self,text='Start',command=self.callback).grid(row=2,column=0,columnspan=2,pady=5)
        #creating a tkinter window with text widget to display the outputstream and start up button

        self.thread=Thread(target=self.update_)
        self.thread.deamon=True
        #creating Thread

        self.mainloop()
    def callback(self):
        sui=subprocess.STARTUPINFO()
        sui.dwFlags|=subprocess.STARTF_USESHOWWINDOW
        #setting subprocess startupflags so that ther won't be an extra shell prompt
        self.prc=subprocess.Popen(('~/Python/Scripts/pyinstaller.exe', ... , '~/myprg.py'),
                                  stdout=subprocess.PIPE,stderr=subprocess.PIPE,startupinfo=sui)
        #starting subprocess with redirected stdout and stderr
        self.thread.start()
    def update_(self):
        try:
            with self.prc.stderr as pipe:
                for line in iter(pipe.readline,b''): self.text.insert(END,line)
                #inserting stderr output stream as is comes
        finally: pass

if __name__=='__main__':
    App()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...