Я пытаюсь скомпилировать скрипт Python, который получает данные из другого скрипта и использует их на экране Kivy, но PyInstaller, очевидно, не находит другой скрипт, импортированный в начале моего основного файла.
После запуска .exe Kivy запускается нормально, глядя в окно консоли, но после этого он быстро открывает окно Kivy и закрывается.
Основной файл находится в папке "src".
Кто-нибудь знает, как я могу заставить PyInstaller находить и компилировать мои скрипты?
Файл, который я пытаюсь скомпилировать (Main.py):
#!/usr/bin/python
# -*- coding: utf8 -*-
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
# from kivy.config import Config
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.core.window import Window
from src.Controller.ModuloController import ModuloController
import multiprocessing
from screeninfo import get_monitors
import kivy.resources
import sys
import os
class Float(FloatLayout):
def __init__(self, **kwargs):
super(Float, self).__init__(**kwargs)
self.modulos = ModuloController.listar()
self.box = BoxLayout(orientation='vertical',
padding=[20, 20],
spacing=20)
self.box.grid = Grid(self.modulos)
self.add_widget(self.box)
self.box.add_widget(self.box.grid)
class Grid(GridLayout):
def __init__(self,
modulos,
**kwargs):
super(Grid, self).__init__(**kwargs)
# self.rows = 2
self.cols = 2
self.spacing = 20
for modulo in modulos:
if modulo.nome == 'Caixa':
self.add_widget(Button(text=modulo.nome,
on_press=self.abrir_caixa,
font_size=36,
background_normal='',
background_color=[0/255.0,
75/255.0,
198/255.0,
1]))
elif modulo.nome == 'Retaguarda':
self.add_widget(Button(text=modulo.nome,
on_press=self.abrir_retaguarda,
font_size=36,
background_normal='',
background_color=[0/255.0,
75/255.0,
198/255.0,
1]))
def abrir_caixa(self, t):
m = multiprocessing.Process(target=ModuloController().iniciar,
args=('Caixa',))
m.start()
def abrir_retaguarda(self, t):
m = multiprocessing.Process(target=ModuloController().iniciar,
args=('Retaguarda',))
m.start()
class ACApp(App):
def build(self):
# Config.set('graphics', 'width', str(get_monitors()[0].width - 7))
# Config.set('graphics', 'height', str(get_monitors()[0].height - 30))
# Config.set('graphics', 'top', 30)
# Config.set('graphics', 'left', 7)
# Config.write()
Window.size = [900, 450]
Window.top = int(get_monitors()[0].height // 2 - Window.size[1] // 2)
Window.left = int(get_monitors()[0].width // 2 - Window.size[0] // 2)
Window.clearcolor = (1, 1, 1, 1)
return Float()
class AcInterface(object):
def iniciar(self):
ACApp().run()
def resourcePath():
'''Returns path containing content - either locally or in pyinstaller tmp file'''
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS)
return os.path.join(os.path.abspath("."))
if __name__ == '__main__':
multiprocessing.freeze_support()
kivy.resources.resource_add_path(resourcePath()) # add this line
# main = multiprocessing.Process(target=AcInterface().iniciar)
# main.start()
ACApp().run()
Я изменил .specсгенерирован PyInstaller и перекомпилирован:
# -*- mode: python -*-
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.core.window import Window
import multiprocessing
from screeninfo import get_monitors
import kivy.resources
import sys
import os
from kivy.deps import sdl2, glew
from kivy.tools.packaging.pyinstaller_hooks import get_deps_minimal, get_deps_all, hookspath, runtime_hooks
block_cipher = None
a = Analysis(['JC_AC_App.py'],
pathex=['C:\\Users\\sony\\Downloads\\Scripts-Python\\AC\\src',
'C:\\Users\\sony\\Downloads\\Scripts-Python\\AC\\src\\Controller'],
binaries=[],
datas=[],
hookspath=hookspath(),
runtime_hooks=runtime_hooks(),
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
**get_deps_all())
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='JC_AC_App',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
strip=False,
upx=True,
name='JC_AC_App')
Я попытался поместить "from src.Controller.ModuloController import ModuloController" в .spec, однако это приводит к следующей ошибке:
965 WARNING: stderr: File "<string>", line 7, in <module> ImportError: No module named src.Controller.ModuloController
967 WARNING: stderr: ImportError: No module named src.Controller.ModuloController
Я уже предупреждал об ошибках, связанных с компиляцией Kivy и многопроцессорностью в Windows.