Chương trình được đóng gói bởi pyinstaller bị treo khi chạy

Hi, chuyện là em đang thử làm một app command line(Hơi hơi kiểu giống nhúng màn hình console vào gui) bằng pyqt5 và đóng gói exe bằng pyinstaller

Lệnh đóng gói của em: pyinstaller --windowed --onefile main.py

Nhưng sau khi thử chạy chương trình với bất kỳ lệnh gì nhập lên app command line thì bị crash

Mà nếu em dùng pyinstaller --windowed main.py hoặc pyinstaller --onefile main.py thì test chạy vẫn ngon nghẻ

Em đoán già đoán non là lỗi đường dẫn os hay gì đấy mà vẫn chưa biết cách xử lý. Mấy bác cho e xin cách xử lý . Thanks!

Em không biết nên đặt title kiểu gì cho nó hợp lý, admin thấy có thể sửa !

file main.py:

import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QPlainTextEdit, QHBoxLayout, QVBoxLayout

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.window_width, self.window_height = 1200, 1500
        self.setMinimumSize(self.window_width, self.window_height)

        self.setWindowTitle('Command Line App')
        layout = QVBoxLayout()
        self.setLayout(layout)

        self.editorCommand = QPlainTextEdit()
        layout.addWidget(self.editorCommand, 3)

        self.editorOutput = QPlainTextEdit()
        layout.addWidget(self.editorOutput, 7)

        buttonLayout = QHBoxLayout()
        layout.addLayout(buttonLayout)

        self.button_run = QPushButton('&Run Command', clicked=self.runCommand)
        buttonLayout.addWidget(self.button_run)

        self.button_clear = QPushButton('&Clear', clicked=lambda: self.editorOutput.clear())
        buttonLayout.addWidget(self.button_clear)

        self.editorCommand.insertPlainText('dir')

    def runCommand(self):
        command_line = self.editorCommand.toPlainText().strip()
        p = os.popen(command_line)
        if p:
            self.editorOutput.clear()
            output = p.read()
            self.editorOutput.insertPlainText(output)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    app.setStyleSheet('''
        QWidget {
            font-size: 30px;
        }
    ''')
    
    myApp = MyApp()
    myApp.show()

    try:
        sys.exit(app.exec_())
    except SystemExit:
        print('Closing Window...')

Note: em có hỏi trên stackoverflow nhưng tiếng anh cùi mìa nên chưa ai trả lời: https://stackoverflow.com/questions/68648070/program-packaged-by-pyinstaller-crashes-when-running

1 Like

Nó có hiện thông báo hay bất kỳ thông tin gì về lỗi không bạn?

Nhưng khi bạn đóng gói chỉ bằng -w hoặc --onefile thì vẫn chạy được mà, sau khi đóng gói và chạy thì có khác biệt gì khi dùng cả 2 không mà bạn cần luôn cả 2 tham số?

Mình nghĩ có thể liên quan đến sys.stdout, sys.stdinsys.stderr, vì khi có -w thì các luồng tiêu chuẩn không được hỗ trợ nữa. Bạn phải tự mở chúng lên.

3 Likes

Em dùng --windowed để tắt màn hình console đi và dùng --onefile để gộp tất cả thư viện và .dll vào 1 file exe
Như bác nói luồng tiêu chuẩn không được hỗ trợ khi dùng --windowed. Nhưng nếu chỉ dùng --windowed thì nó vẫn chạy bình thường hà
Bác có kế sách nào ko :laughing:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?