Создайте файл .exe из .py с помощью cx_Freeze - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать исполняемый файл из проекта на python (setup.py)

    import sys
    import xlrd
    import pyodbc
    import tkinter as tk
    import os.path
    from PyQt5.QtCore import pyqtSlot
    from PyQt5.QtWidgets import QApplication,QDialog
    from PyQt5.uic import loadUi
    from PyQt5 import QtGui
    from tkinter import filedialog
    from datetime import datetime, timedelta
    from win32api import GetSystemMetrics
    from cx_Freeze import setup, Executable

    base = None    

    PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
    os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
    os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')
    #os.environ['TCL_LIBRARY'] = r'C:\Users\PQ946KK\AppData\Local\Programs\Python\Python37\tcl\tcl8.6'
    #os.environ['TK_LIBRARY'] = r'C:\Users\PQ946KK\AppData\Local\Programs\Python\Python37\tcl\tk8.6'

    executables = [Executable("Load File.py",
                   base=base,
                   icon="BI Icon.ico")] 

    packages = ["tkinter","pyodbc","PyQt5","datetime","win32api"]

    files = ["BI Icon.ico","Load Excel.ui",
             r"C:\Users\PQ946KK\Documents\Leti\Proyectos\PowerBI\Icon\arrow up load.png",
             os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
             os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll')]

    options = {
        'build_exe': {    
            'packages':packages,
            'include_files':files,
        },    
    }

    setup(
        name = "LoadFile BI",
        options = options,
        version = "0.1",
        description = 'Ejecutable de Aplicacion Load File',
        executables = executables
    )

Всякий раз, когда я строю, он создает только несколько файлов (насколько я помню, он должен создатьбольше файлов и папок)

    (base) C:\Users\XXXXXX\Documents\Leti\Proyectos\PowerBI>python setup.py build
    running build
    running build_exe
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\lib\site-packages\cx_Freeze\bases\Console.exe -> build\exe.win-amd64-3.6\Load File.exe
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-stdio-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-stdio-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\python36.dll -> build\exe.win-amd64-3.6\python36.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\VCRUNTIME140.dll -> build\exe.win-amd64-3.6\VCRUNTIME140.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-math-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-math-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-locale-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-locale-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-string-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-string-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-runtime-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-runtime-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-convert-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-convert-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-time-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-time-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-environment-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-environment-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-process-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-process-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-heap-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-heap-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-conio-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-conio-l1-1-0.dll
    copying C:\Users\PQ946KK\AppData\Local\Continuum\anaconda3\api-ms-win-crt-filesystem-l1-1-0.dll -> build\exe.win-amd64-3.6\api-ms-win-crt-filesystem-l1-1-0.dll

    (base) C:\Users\XXXXXX\Documents\Leti\Proyectos\PowerBI>python setup.py build

Я попытался переустановить Python, Anaconda и настроить глобальные переменные, но все же не удалось получить тот же результат, и, конечно, файл .exe не работает.Сообщение об ошибке:

Неустранимая ошибка Python: Py_Initialize: невозможно загрузить кодек файловой системы ModuleNotFoundError: Нет модуля с именем 'encodings'

Я должен также упомянуть, что этовпервые я создаю файл с отдельным файлом .ui.

1 Ответ

0 голосов
/ 07 декабря 2018
  1. Вы пытались добавить encodings в список packages?

    packages = ["tkinter","pyodbc","PyQt5","datetime","win32api","encodings"]
    
  2. Обратите внимание, что, если вы заморозите свою заявкув cx_Freeze версии 5.1.1 (текущая версия по умолчанию) или 5.1.0 необходимо включить библиотеки DLL TCL и TK в подкаталог lib.Вы можете сделать это, передав кортеж (source, destination) соответствующей записи опции списка include_files:

    files = ["BI Icon.ico", "Load Excel.ui",
             r"C:\Users\PQ946KK\Documents\Leti\Proyectos\PowerBI\Icon\arrow up load.png",
             (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll')),
             (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll'))]
    
  3. Если вы создаете приложение с графическим интерфейсом (как кажется),Вы также должны изменить определение base, как указано ниже в вашем скрипте установки, прежде чем использовать его в Executable:

    # GUI applications require a different base on Windows (the default is for a console application).
    base = None
    if sys.platform == "win32":
        base = "Win32GUI"
    
  4. Почему вы на самом деле используете tkinter иPyQt5?Одного должно быть достаточно, чтобы предоставить графический интерфейс, не так ли?Если вы не используете tkinter в своем приложении (как я предполагаю), вам часто нужно явно исключить его в сценарии установки с помощью опции списка excludes (и, конечно, удалить его из списка packages иудалите import tkinter as tk):

    packages = ["pyodbc","PyQt5","datetime","win32api"]
    
    files = ...
    
    excludes = ['tkinter']
    
    options = {
        'build_exe': {    
            'packages':packages,
            'include_files':files,
            'excludes':excludes
            },    
        }
    

    Возможно, вам больше не понадобится предоставлять библиотеки TK и TCL.

  5. Использование отдельного файла .uiне проблема с cx_Freeze.Вам следует только убедиться, что замороженное приложение ищет файл .ui в нужном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...