2017-02-22 221 views
2

现在我已经试图将我的python应用程序打包为独立的可执行文件。我一直试图使用py2exe,但它似乎从来没有工作。不能让py2exe工作

可以说我们有机器A和机器B,我在机器A上构建程序并尝试在机器B上作为可执行文件运行。在试图在机器B上运行的前几次尝试中,它会说FATAL ERROR: Cannot load python library,但是我认为这是下降到py2exe过程说1 missing module全:

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\ 

然后我看到了这个问题Py2Exe "Missing Modules",发现我需要安装pyreadline所以我做,那么py2exe过程didnt返回任何缺失的模块,像这样:

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\ 

但现在当.exe运行只输出port>一个窗口中显示,而应用程序运行的机器上精机B A

这是我的安装文件:

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

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

和在我的计划进口都在Python的标准版本分别是:

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

IM可能做一些显然是错误的,但我不能工作了什么,有谁知道我可以解决这个问题,或者我只是不得不放弃?

dist文件夹看起来是这样的:

dist folder

+0

与像py2exe软件构建独立应用程序可以是一个丑陋的业务。这是可行的(我已经做了很多次),但是你最终花费了大量的时间修改分发文件夹(比如“手动”复制丢失的东西)。 python和py2exe版本对于这个问题都很重要。还有日志文件的结果(当您运行该软件时,它会显示在远处)。 [continue ...] – armatita

+0

[...继续]我的建议是让你改变你的独立发行版的范例。与其试图使用py2exe打包所有文件,不如使用便携式软件将可移植版本的Python(例如[WinPython](http://winpython.github.io/))与一个.exe或批处理文件分发到应用程序中版。这是我目前正在分发我的主要独立应用程序(例如:[GEOMS2](https://sourceforge.net/projects/geoms2/))。 – armatita

+0

我在哪里可以找到日志文件? – badNameHere

回答

1

我终于得到了这个工作,利用这个问题py2exe - generate single executable file

我发现我不得不修改我的设置文件,它现在看起来像这个:

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, 
) 

但后来因为在我的代码我使用os.path.dirname(os.path.realpath(__file__))py2exe犯规支持__file__,我发现自己在这个问题上How do I get the path of the current executed file in Python?和使用ArtOfWarfare的回答得到当前路径,即:

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