Rutas absolutas después de congelar con cx_freeze (aplicación Qt5 / PySide2)

8

Problema:

No puedo distribuir un .exe generado por cx_freeze a otra máquina, porque parece que el exe contiene referencias a rutas absolutas en la máquina que generó el .exe. También tuve que incluir vcruntime140.dll directamente, porque no copié "include_msvcr": Trueel archivo.

Preparar

  • Gana 10
  • Python 3.7.2
  • cx_freeze 6.0
  • NO virtualenv (aunque no parece importar, lo he intentado con venv)

Preguntas similares

Esta pregunta se ha hecho anteriormente de forma similar, pero no tiene una respuesta: ruta de copias cx_Freeze

Registro de errores

Al iniciar el script, aparecen los siguientes errores (no puedo copiar / pegar desde la ventana, así que comparto una imagen). Puede ver las referencias a una ruta absoluta C:\Program Files (x86)\Python....que obviamente no está presente en otra máquina.

registro de errores de cx_freeze

congelar script

from os.path import dirname
from cx_Freeze import setup, Executable
from config import settings
import os.path
import sys
import glob

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
DEPENDENCY_DIR = os.path.join(os.getcwd(), 'dependencies')
os.environ['TCL_LIBRARY'] = os.path.join(DEPENDENCY_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(DEPENDENCY_DIR, 'tcl', 'tk8.6')

packages = ["sepa", "datev", "atexit", "shiboken2", "PySide2"]
includes = []
excludes = ["Pyside2.Qt5WebEngineCore.dll"]
includefiles = ['qt', 'settings', 'config', os.path.join(DEPENDENCY_DIR, 'DLLs', 'tk86t.dll'),
             os.path.join(DEPENDENCY_DIR, 'DLLs', 'tcl86t.dll'), os.path.join(DEPENDENCY_DIR, 'DLLs', 'vcruntime140.dll')]

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {"packages": packages,
                     "excludes": excludes,
                     "includes": includes,
                     "include_files": includefiles,                     
                     "optimize": 2,
                     "include_msvcr": True}



# 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="sepa_converter",
      version=settings.version,
      description="Programm zum Konvertiern von SEPA Dateien zum importieren in Buchhaltungsprogramme",
      options={"build_exe": build_exe_options},
      executables=[Executable("export_gui.py", base=base)])

#Debug DLLs von Pyside2 löschen
tmp = glob.glob("build/*/Pyside2/*d.dll")
for i in tmp:
    os.remove(i)

tmp = glob.glob("build/*/Pyside2/*/*/*d.dll")
for i in tmp:
    os.remove(i)

filelist = ['Qt5WebEngineCore.dll', 'icudt54.dll', 'opengl32sw.dll', 'Qt5Designer.dll', 'd3dcompiler_47.dll', 'Qt5Quick.dll']
for f in filelist:
    for i in glob.glob("build/*/Pyside2/%s" % f):
        os.remove(i)
Harper
fuente
1
Estoy teniendo el mismo problema.
jonathan9879

Respuestas:

1

La degradación a cx_freeze 5.1.1 resolvió el problema por mí.

Lawrence
fuente
Finalmente logré instalar 5.1.1 (tuve que instalarlo directamente desde git, el PyPi no se instaló), pero el .exe no hace nada. Haz clic en -> Nada. Perfecto para depurar.
Harper
Hola @Lawrence, te otorgué la recompensa, porque tu respuesta me puso en el camino correcto, incluso si faltaban algunas partes para la solución final. Saludos y ty!
Harper
1

Pasos para que funcione:

  1. Instale Python 3.6 de 32 bits . Otras versiones no funcionaron para mí. 32 bits parece ser importante para las partes Qt / Tk del skript, 3.6 fue importante para cx-freeze 5.1.1.
  2. Instale cx-freeze == 5.1.1
  3. Compilar .exe.
Harper
fuente