2017-02-22 1 views
2

depuis des lustres maintenant j'ai essayé d'emballer mes applications python comme un exécutable autonome. J'ai essayé d'utiliser py2exe mais il n'a jamais semblé fonctionner. Disons que nous avons la machine A et la machine B, je construis le programme sur la machine A et essaye de fonctionner en tant qu'exécutable sur la machine B. Les premières tentatives pour exécuter sur la machine B diraient FATAL ERROR: Cannot load python library mais je pensée qui était en baisse au processus py2exe disant 1 missing module complet:ne peux pas obtenir py2exe au travail

1 missing Modules 
    ------------------ 
? readline       imported from cmd, code, pdb 
Building 'dist\workinghoursGUI.exe'. 
Building shared code archive 'dist\library.zip'. 
Copy c:\python34\python34.dll to dist 
Copy C:\Python34\DLLs\select.pyd to dist\select.pyd 
Copy C:\Python34\DLLs\_lzma.pyd to dist\_lzma.pyd 
Copy C:\Python34\DLLs\_socket.pyd to dist\_socket.pyd 
Copy C:\Python34\DLLs\unicodedata.pyd to dist\unicodedata.pyd 
Copy C:\Python34\DLLs\_bz2.pyd to dist\_bz2.pyd 
Copy C:\Python34\DLLs\pyexpat.pyd to dist\pyexpat.pyd 
Copy C:\Python34\DLLs\_hashlib.pyd to dist\_hashlib.pyd 
Copy C:\Python34\DLLs\_ssl.pyd to dist\_ssl.pyd 
Copy C:\Python34\DLLs\_ctypes.pyd to dist\_ctypes.pyd 
Copy C:\Python34\DLLs\_tkinter.pyd to dist\_tkinter.pyd 
Copy DLL C:\Python34\MSVCR100.dll to dist\ 
Copy DLL C:\Python34\DLLs\tk86t.dll to dist\ 
Copy DLL C:\Python34\DLLs\tcl86t.dll to dist\ 

alors j'ai vu cette question Py2Exe "Missing Modules" et a découvert que je devais installer pyreadline donc je ne puis le processus py2exe na pas retourner les modules manquants comme ceci:

Building 'dist\workinghoursGUI.exe'. 
Building shared code archive 'dist\library.zip'. 
Copy c:\python34\python34.dll to dist 
Copy C:\Python34\lib\site-packages\win32\_win32sysloader.pyd to dist\_win32sysloader.pyd 
Copy C:\Python34\DLLs\_ssl.pyd to dist\_ssl.pyd 
Copy C:\Python34\DLLs\select.pyd to dist\select.pyd 
Copy C:\Python34\DLLs\_socket.pyd to dist\_socket.pyd 
Copy C:\Python34\DLLs\_bz2.pyd to dist\_bz2.pyd 
Copy C:\Python34\DLLs\_lzma.pyd to dist\_lzma.pyd 
Copy C:\Python34\DLLs\pyexpat.pyd to dist\pyexpat.pyd 
Copy C:\Python34\DLLs\_tkinter.pyd to dist\_tkinter.pyd 
Copy C:\Python34\DLLs\unicodedata.pyd to dist\unicodedata.pyd 
Copy C:\Python34\lib\site-packages\win32\win32api.pyd to dist\win32api.pyd 
Copy C:\Python34\DLLs\_hashlib.pyd to dist\_hashlib.pyd 
Copy C:\Python34\lib\site-packages\win32\win32evtlog.pyd to dist\win32evtlog.pyd 
Copy C:\Python34\DLLs\_ctypes.pyd to dist\_ctypes.pyd 
Copy DLL C:\Python34\DLLs\tcl86t.dll to dist\ 
Copy DLL C:\Python34\MSVCR100.dll to dist\ 
Copy DLL C:\Python34\DLLs\tk86t.dll to dist\ 
Copy ExtensionDLL C:\Python34\pywintypes34.dll to dist\ 

mais maintenant sur la machine B lorsque le .exe est exécuté une fenêtre avec juste la sortie port> est affiché pendant que l'application fonctionne très bien sur la machine A

ceci est mon fichier de configuration:

from distutils.core import setup 
import py2exe,sys,os 

setup(console=['workinghoursGUI.py']) 

et la les importations dans mon programme sont tous dans la version standard de python qui sont:

from tkinter import * 
from tkinter import ttk 
import tkinter as tk 
import tkinter.messagebox as tkm 
import datetime,os,time 

im probablement faire quelque chose de mal, mais évidemment je ne peux pas travailler quoi, est-ce que quelqu'un sait comment je peux résoudre ce problème ou est-ce que je vais devoir abandonner?

le dossier dist ressemble à ceci:

dist folder

+0

applications autonomes de construction avec des logiciels comme py2exe peut être une vilaine affaire. C'est faisable (j'ai fait beaucoup, beaucoup de fois) mais vous finissez par passer beaucoup de temps à bricoler avec le dossier de distribution (comme "manuellement" copier les choses manquantes). Les versions python et py2exe sont toutes deux importantes pour cette question. Aussi les résultats du fichier journal (qui apparaît dans dist lorsque vous exécutez le logiciel). [continue ...] – armatita

+0

[... continue] Mon conseil est que vous changiez le paradigme de vos distributions autonomes. Au lieu d'essayer de tout empaqueter en utilisant py2exe juste distribuer une version portable de Python (par exemple [WinPython] (http://winpython.github.io/)) avec votre logiciel avec un fichier .exe ou par lots lancer l'application en utilisant le portable version. C'est ainsi que je distribue actuellement mes principales applications autonomes (par exemple: [GEOMS2] (https://sourceforge.net/projects/geoms2/)). – armatita

+0

où trouverais-je le fichier journal? – badNameHere

Répondre

1

i ont finalement obtenu que cela fonctionne, en utilisant cette question py2exe - generate single executable file

j'ai découvert que je devais modifier mon fichier de configuration qui ressemble maintenant ce:

from distutils.core import setup 
import py2exe, sys, os 

sys.argv.append('py2exe') 
#bundle files set to 2 because its a tkinter app 
setup(
    options = {'py2exe': {'bundle_files': 2, 'compressed': True}}, 
    windows = [{'script': "workinghoursGUI.pyw"}], 
    zipfile = None, 
) 

mais alors parce que dans mon code j'utilisais os.path.dirname(os.path.realpath(__file__)) et py2exe ne marche pas le soutien __file__, je me suis trouvé sur cette question How do I get the path of the current executed file in Python? et utilisé la réponse de ArtOfWarfare pour obtenir le chemin actuel, qui est:

from inspect import getsourcefile 
from os.path import abspath 
... 
abspath(getsourcefile(lambda:0))