2016-08-24 4 views
0

Я уже давно пытаюсь создать исполняемый файл для проекта Python. В этом проекте, мне нужно использовать:Невозможно создать функциональный исполняемый файл с PyInstaller и PyQt

  1. PyQt (4): для моего GUI,
  2. PySerial: общаться с Arduino,
  3. подпроцесса: запустить некоторые Avr вещи с .bat файла

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

Итак, я попытался выяснить, откуда может возникнуть проблема, написав некоторые базовые программы, которые сгущают все функции, которые мне нужны для моего проекта. Все работает, когда я запускаю это из python (3.5), но не выполняю файл, сгенерированный pyinstaller. (The 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» к данным в файл .spec для pyinstaller, а функция subprocess_arg здесь, чтобы избежать проблем с подпроцесса (как упоминалось в документации here)

Во-первых, я думал, что проблема была связана с подпроцесса, я попытался удалить все ссылки на него, по-прежнему не работает , То же самое для Serial. Более того, я попытался отладить исполняемый файл, установив debug = True в файле .spec, но если я попытаюсь выполнить файл с консоли, ничего не произойдет вообще, он останется заблокированным в первой строке.

Так что если кто-нибудь может помочь! заранее спасибо !

+0

Вы используете 'console = False'? Это может быть причиной того, что вы ничего не видите в командной строке. Мое лучшее предположение, что «интерфейс» является причиной проблемы. Убедитесь, что он включен в сборку или создает пример без него и попробуйте «заморозить» его. – Repiklis

+0

Я использую 'console = True' и' debug = True'. Я просто попытался добавить 'interface.py' к данным для включения в spec-файл, все еще не работающий – Wogle220

ответ

0

Возможно, «замороженное» приложение не находит «cmd.bat» !? Вы можете проверить его, заменив его на абсолютный путь.

Ваш исполняемый файл распаковывает «cmd.bat» во временную папку, доступную на python с sys._MEIPASS. Вы должны найти свои файлы с чем-то вроде os.path.join(sys._MEIPASS, "cmd.bat")!?

В случае необходимости: getattr(sys, 'frozen', False) указывает, был ли ваш код заморожен или нет (но только для PyInstaller).

Смежные вопросы