exe erstellen

Probleme bei der Installation?
Antworten
Benutzeravatar
hiha
User
Beiträge: 1
Registriert: Dienstag 7. Oktober 2008, 10:39

Hallo Leute,

ich versuche gerade eine exe-Datei unter winxp zu erstellen. Ich habe 2 Probleme:

1. Kopiere ich die test.exe mit den python26.dll und msvcr90.dll zusammen auf einen anderen PC findet der PC die DLLs nicht mehr.

2. beim build, funktionieren die Kommandos "--icon=gsm.ico" und "--onefile" nicht. Wie ist die genaue Syntax???

73 hiha

edit: sorry das Tool heißt pyinstaller 1.2, das " --onefile" haut hin aber auf dem Fremdrechner weiterhin siehe 1. sogar das "onefile" looft nicht :cry:
Er sucht die "C:\DOKUME~1\USER\LOKALE~1\Temp\_MEI2164\python26.dll" diese ist im selben Verzeichnis wie die "test.exe" und nochmal in "C:\windows\system32\" drin! Das "..LOKALE\_MEI2164.." gibts gar net!
Zuletzt geändert von hiha am Mittwoch 8. Oktober 2008, 13:09, insgesamt 2-mal geändert.
Ich bin Python-Neuling
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo hiha, willkommen im Forum,

Wenn du nicht sagst, welches Tool du zum erstellen der EXE-Dateien nutzt, wirst du wohl kaum Hilfe bekommen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Sieht ganz nach einem Problem aus, das ich auch schon hatte (Python 2.6, pyinstaller 1.3, WinXP, anderer PC kein Python, Vista) und das mich einige Zeit (etwas mehr als 5 h oO) und Nerven gekostet hat.

msvcr90.dll kann nicht alleine verwendet werden, sondern nur als Assembly (das hat sich MS ausgedacht). Das schaut so aus:
Verzeichnis Microsoft.VC90.CRT, darin msvcm90.dll, msvcp90.dll und msvcr90.dll sowie ein Microsoft.VC90.CRT.manifest.
Man kann einfach den entsprechenden Ordner aus %ProgramFiles%\Microsoft Visual Studio 9.0\VC\redist\x86 der MS Visual C++ 2008 Express Edition nehmen.

Dann weiß ich nicht, wie du pyinstaller v1.2 unter Python 2.6 zum laufen gebracht hast, die v1.3 die ich verwendet habe brauchte einige Patches und ich musste die Bootloader mit SCons neu erzeugen, bevor es lief. Hier mal der grobe Ablauf:

- SCons installieren (http://www.scons.org/)
- folgende Patches zu pyinstaller-1.3 hinzufügen (alles inoffizielle Hacks von mir):

Build.py:

Code: Alles auswählen

--- Build.py.bak	Tue Sep 05 08:44:44 2006
+++ Build.py	Wed Oct 22 23:55:36 2008
@@ -510,7 +510,13 @@
         if iswin:
             exe = exe + "_"
             is24 = hasattr(sys, "version_info") and sys.version_info[:2] >= (2,4)
-            exe = exe + "67"[is24]
+            is26 = hasattr(sys, "version_info") and sys.version_info[:2] >= (2,6)
+            if is26:
+                print "Using MSVC 9"
+                exe = exe + "9"
+            else:
+                print "Using MSVC %s" % "67"[is24]
+                exe = exe + "67"[is24]
             exe = exe + "rd"[self.debug]
             exe = exe + "wc"[self.console]
         else:
Sconstruct:

Code: Alles auswählen

--- Sconstruct.bak	Sun Aug 06 17:09:36 2006
+++ Sconstruct	Thu Oct 23 01:47:20 2008
@@ -15,6 +15,8 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 
+import os
+
 platform = Platform()
 envs = []
 
@@ -26,18 +28,18 @@
     #   Python 2.4).
     # - Either debug build (with debug messages) or release build.
     # - Either console program or windowed program.
-    for msvs_ver in "6.0", "7.1":
-        base_env = Environment(MSVS_VERSION = msvs_ver)
+    for msvs_ver in "6.0", "7.1", "9.0":
+        base_env = Environment(MSVS_VERSION = msvs_ver, ENV = os.environ)
 
         for flavour in "debug", "release":
             for mode in "cons", "win":
-                env = base_env.Copy()
+                env = base_env.Clone()
 
                 # The bootloader is built as a static executable. We want it
                 # to be self-contained. Extra care was put in writing it so
                 # that it does not share objects/memory with python.dll (which
                 # it loads).
-                env.Append(CCFLAGS = ["/ML"])
+                env.Append(CCFLAGS = ["/MT"])
 
                 if flavour == "debug":
                     # No optimizations
iu.py:

Code: Alles auswählen

--- iu.py.bak	Sun Oct 12 00:45:27 2008
+++ iu.py	Sun Oct 12 00:40:41 2008
@@ -271,7 +271,7 @@
         import __builtin__
         __builtin__.__import__ = self.importHook
         __builtin__.reload = self.reloadHook
-    def importHook(self, name, globals=None, locals=None, fromlist=None):
+    def importHook(self, name, globals=None, locals=None, fromlist=None, level=-1):
         # first see if we could be importing a relative name
         #print "importHook(%s, %s, locals, %s)" % (name, globals['__name__'], fromlist)
         _sys_modules_get = sys.modules.get
source\windows\run.rc:
source\windows\runw.rc:

Code: Alles auswählen

--- run.rc.bak	Sat Jul 08 14:51:46 2006
+++ run.rc	Wed Oct 22 23:01:22 2008
@@ -7,7 +7,8 @@
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+//#include "afxres.h"
+#include "windows.h"
 
 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
@@ -43,7 +44,8 @@
 
 2 TEXTINCLUDE DISCARDABLE
 BEGIN
-    "#include ""afxres.h""\r\n"
+    //"#include ""afxres.h""\r\n"
+    "#include ""windows.h""\r\n"
     "\0"
 END
- Die Visual Studio 2008-Eingabeaufforderung öffnen
- PATH <python_install_dir>\Scripts;%PATH% eingeben, damit er SCons findet (<python_install_dir> durch den Python-Installpfad ersetzen)
- dann im pyinstaller-1.3 Verzeichnis SCons laufen lassen, das erzeugt die Bootloader neu

Achtung: --onefile funktioniert mit pyinstaller so NICHT mehr, also nicht verwenden.
Wie gehabt Build.py <specfile> um die exe zu erstellen.
Dann den oben genannten Microsoft.VC90.CRT Ordner (also nicht nur den Inhalt, sondern Ordner + Inhalt) in den dist-Ordner kopieren.
Als Abschluß im dist-Ordner eine <exename>.exe.manifest Datei erstellen mit folgendem Inhalt (das <exename> natürlich hier durch den Namen der exe ersetzen, ausserdem sollte man Organization.Division.Name und Description in dem manifest-Template unten durch etwas Sinnvolles ersetzen):

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="x86"
    name="Organization.Division.Name"
    type="win32"
/>
<description>Description</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.VC90.CRT"
            version="9.0.21022.8"
            processorArchitecture="x86"
            publicKeyToken="1fc8b3b9a1e18e3b"
        />
    </dependentAssembly>
</dependency>
</assembly>
Also wie man sieht, alles in allem eine äußerst spaßige Angelegenheit :mrgreen: Aber wenn mans einmal gemacht hat, hat man dafür Ruhe...

*** Nachtrag 28.10.2008: Wenn man das Microsoft Visual C++ 2008 Redistributable Package (x86) installiert, braucht man den Ordner Microsoft.VC90.CRT samt Inhalt nicht mehr und --onefile geht auch wieder. Dann muss aber jeder Nutzer der fertigen exe das Redistributable Package installieren.
Ausserdem empfiehlt es sich, das Manifest in der exe einzubetten (dazu darf aber von PyInstaller keine UPX-Kompression angewandt werden). Microsofts mt.exe Tool geht hierfür leider nicht mit PyInstaller, als Alternative funktioniert Resource Hacker:

Code: Alles auswählen

ResHack.exe -addoverwrite <exename>.exe, <exename>_out.exe, <exename>.exe.manifest, 24,1,
Antworten