2017-02-22 269 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))