Absolute Pfade nach dem Einfrieren mit cx_freeze (Qt5 / PySide2 App)

8

Problem:

Ich kann eine von cx_freeze generierte EXE-Datei nicht an einen anderen Computer verteilen, da die Exe anscheinend Verweise auf absolute Pfade auf dem Computer enthält, der die EXE-Datei generiert hat. Ich musste auch vcruntime140.dll direkt einbinden, weil"include_msvcr": True die Datei nicht kopiert wurde.

Installieren

  • Gewinnen Sie 10
  • Python 3.7.2
  • cx_freeze 6.0
  • NO virtualenv (scheint aber keine Rolle zu spielen, ich habe es mit venv versucht)

Ähnliche Fragen

Diese Frage wurde bereits in ähnlicher Form gestellt, hat jedoch keine Antwort: cx_Freeze kopiert den Pfad

Fehlerprotokoll

Beim Starten des Skripts werden die folgenden Fehler angezeigt (kann nicht aus dem Fenster kopiert / eingefügt werden, daher teile ich ein Bild). Sie können die Verweise auf einen absoluten Pfad sehen C:\Program Files (x86)\Python...., der offensichtlich auf einem anderen Computer nicht vorhanden ist.

cx_freeze Fehlerprotokoll

Skript einfrieren

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
quelle
1
Ich habe das gleiche Problem.
Jonathan 9879

Antworten:

1

Ein Downgrade auf cx_freeze 5.1.1 hat das Problem für mich behoben.

Lawrence
quelle
Ich habe es endlich geschafft, 5.1.1 zu installieren (musste es direkt von Git installieren, das PyPi wurde nicht installiert), aber die EXE-Datei macht nichts. Klicken Sie darauf -> Nichts. Perfekt zum Debuggen.
Harper
Hallo @Lawrence, ich habe dir das Kopfgeld verliehen, weil deine Antwort mich auf den richtigen Weg gebracht hat, auch wenn einige Teile für die endgültige Lösung fehlten. Prost und ty!
Harper
1

Schritte, damit es funktioniert:

  1. Installieren Sie Python 3.6 32-Bit . Andere Versionen haben bei mir nicht funktioniert. 32-Bit scheint für die Qt / Tk-Teile des Skripts wichtig zu sein, 3.6 war wichtig für cx-freeze 5.1.1.
  2. Installieren Sie cx-freeze == 5.1.1
  3. Erstellen Sie .exe.
Harper
quelle