Я уже давно пытаюсь создать исполняемый файл для проекта Python. В этом проекте, мне нужно использовать:Невозможно создать функциональный исполняемый файл с PyInstaller и PyQt
- PyQt (4): для моего GUI,
- PySerial: общаться с Arduino,
- подпроцесса: запустить некоторые 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, но если я попытаюсь выполнить файл с консоли, ничего не произойдет вообще, он останется заблокированным в первой строке.
Так что если кто-нибудь может помочь! заранее спасибо !
Вы используете 'console = False'? Это может быть причиной того, что вы ничего не видите в командной строке. Мое лучшее предположение, что «интерфейс» является причиной проблемы. Убедитесь, что он включен в сборку или создает пример без него и попробуйте «заморозить» его. – Repiklis
Я использую 'console = True' и' debug = True'. Я просто попытался добавить 'interface.py' к данным для включения в spec-файл, все еще не работающий – Wogle220