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)


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.


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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.