Создать исполняемый файл с Python 3.7 PyQt5 и cx_Freeze, но DLL не удалось загрузить - PullRequest
1 голос
/ 19 сентября 2019

Я разработал «не очень простой» графический интерфейс с PyQt5 через Anaconda 3 (Python 3.7) и Designer.У меня есть 3 разных файла .ui, которые я импортирую в свою программу.

Когда я запускаю cx_Freeze, все работает хорошо, я создаю .exe.Затем я копирую папку «platform» из папки «Python» в папке «Build», которую создает cx_Freeze.

НО, когда я передаю ее на другую машину без чего-либо (без анаконды, нетPython, нет cx_Freeze, ничего), приложение не запускается.Я получаю:

ImportError: DLL load failed: The specified module could not be found

Это происходит в 10-й строке моего кода:

from PyQt5 import QtGui, QtWidgets

Импорт в мой код:

from PyQt5 import QtGui, QtWidgets
import sys
import glob
import datetime
from matplotlib.backends.qt_compat import QtCore, QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure
import numpy as np
import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

import design
import flex
import entry

design, flex и entry - это файлы .ui.Все они содержат эту часть в конце (не знаю, поможет ли это):

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

И, наконец, установочный файл, который я запускаю с помощью cx_Freeze:

import sys
from cx_Freeze import setup, Executable
import matplotlib
import numpy


# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {"packages": ["os", "matplotlib"], "includes": ["PyQt5", "atexit"], "excludes": ["tkinter"]}

# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "Flexicounts",
        version = "0.1",
        description = "Flexicounts pour faire tes comptes facilement",
        options = {"build_exe": build_exe_options},
        executables = [Executable("flexicounts.py", base=base)])

Я прочиталмного об этом, но я чувствую, что нет никакого «чудесного» решения ...

Не могли бы вы помочь мне заморозить мое приложение и заставить его работать на "девственной машине"?

1 Ответ

0 голосов
/ 20 сентября 2019

Возможно, вы сталкиваетесь с проблемой # 504 из хранилища cx_Freeze.В этом случае, цитируя комментарий marceloduarte там:

Обходной путь - скопировать python3.dll в каталог, где был создан исполняемый файл.cx_Freeze копирует python37.dll, но не копирует python3.dll.vcruntime140.dll также может потребоваться скопировать, когда его больше нет в системе.

Сначала попробуйте вручную скопировать эти библиотеки DLL (вы найдете их в каталоге вашей установки python, содержащей python.exe).) в каталог вашего исполняемого файла.Если это решит проблему, вы можете сказать cx_Freeze сделать это за вас, используя список include_files из build_exe_options.Измените сценарий установки следующим образом:

import os
python_dir = os.path.dirname(sys.executable)  # directory of your python installation
build_exe_options = {"packages": ["os", "matplotlib"], 
                     "includes": ["PyQt5", "atexit"],
                     "include_files": [os.path.join(python_dir, "python3.dll"), os.path.join(python_dir, "vcruntime140.dll")], 
                     "excludes": ["tkinter"]}

Возможно, вам потребуется скопировать дополнительные библиотеки DLL, такие как msvcp140.dll, или любую другую библиотеку DLL, находящуюся в каталоге site-packages/PyQt5 (включая подкаталоги) вашей установки Python.

...