无法使用PyInstaller和PyQt创建功能可执行文件

时间:2016-08-24 15:11:30

标签: python qt python-3.x subprocess pyinstaller

我已经尝试了很多时间来为Python项目创建可执行文件。在这个项目中,我需要使用:

  1. PyQt(4):对于我的GUI,
  2. PySerial:与arduino沟通,
  3. 子流程:使用.bat文件启动一些avr项目
  4. 事实上,可执行文件是创建的,但是当我尝试启动它时没有任何反应,只是我的鼠标告诉我她已被占用。

    所以,我试图通过编写一些基本程序来找出可能出现问题的地方,这些程序会压缩我项目所需的所有功能。当我从python(3.5)启动它时,一切都正常,但是当我执行pyinstaller生成的文件时却没有。 (interface.py文件是here, in a pastebin.com file,如果你愿意,我认为它不是很相关:它只是一个带按钮的表单)

    from PyQt4 import QtGui
    from interface import Ui_Form
    import serial
    import subprocess
    import sys, os
    
    class win(QtGui.QWidget, Ui_Form):
        """docstring for win"""
        def __init__(self):
            super(win, self).__init__()
            self.setupUi(self)
            self.ser = serial.Serial("COM3", 9600)
            self.pathBat = "cmd.bat"
    
        def on_pushButton_clicked(self):
                #if (self.ser.isOpen() and self.serAvr.isOpen()):
                if True:
                    self.ser.write("start".encode())
                    p = subprocess.call(self.pathBat, creationflags=subprocess.CREATE_NEW_CONSOLE, **self.subprocess_args())
    
                    if p == 1:
                        self.writeLog("Works")
                        self.ser.write("stop".encode())
                    #self.writeLog(p.returncode)
    
        def subprocess_args(include_stdout=True):
            # The following is true only on Windows.
            if hasattr(subprocess, 'STARTUPINFO'):
                # On Windows, subprocess calls will pop up a command window by default
                # when run from Pyinstaller with the ``--noconsole`` option. Avoid this
                # distraction.
                si = subprocess.STARTUPINFO()
                si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
                # Windows doesn't search the path by default. Pass it an environment so
                # it will.
                env = os.environ
            else:
                si = None
                env = None
    
    
            ret = {}
            # On Windows, running this from the binary produced by Pyinstaller
            # with the ``--noconsole`` option requires redirecting everything
            # (stdin, stdout, stderr) to avoid an OSError exception
            # "[Error 6] the handle is invalid."
            ret.update({'stdin': subprocess.PIPE,
                        'stderr': subprocess.PIPE,
                        'startupinfo': si,
                        'env': env })
            return ret
    
    
    app = QtGui.QApplication(sys.argv)
    v = win()
    v.show()
    sys.exit(app.exec_())
    

    我添加了" cmd.bat"对于pyinstaller的.spec文件中的数据,函数 subprocess_arg 用于避免子进程出现问题(如文档here中所述)

    首先我认为问题是与子进程相关联的,我试图删除对它的所有引用,仍然无法正常工作。串行相同。此外,我尝试通过在.spec文件中设置debug = True来调试可执行文件,但如果我尝试从控制台执行该文件,则根本不会发生任何事情,它会在第一行停止。

    所以,如果有人可以提供帮助!提前谢谢你!

1 个答案:

答案 0 :(得分:0)

也许“冻结”的应用程序找不到“cmd.bat”!?您可以通过用绝对路径替换它来测试它。

您的可执行文件将“cmd.bat”解压缩到可在sys._MEIPASS的python中访问的临时文件夹中。您应该找到类似os.path.join(sys._MEIPASS, "cmd.bat")的文件!?

如果您需要它:getattr(sys, 'frozen', False)表示您的代码是否被冻结(但仅适用于PyInstaller)。