打包的代碼一般都須要寫一個簡單的界面,通常用PyQt來寫。用PyQt寫界面的方法請戳這裏:PyQt5的安裝及基本配置 PyQt5教程
html
python提供了幾個用來打包的模塊,主要有py2app、py2exe、pyinstaller,其中第一個是用來打包來給mac用的,後二者是針對於windows系統。python
關於py2exe和pyinstaller二者的比較:git
對於pyinstaller和py2exe兩種把Python文件打包成exe的可執行文件的方法,都有各自的優缺點。可是最終目的都是爲了在沒有Python環境下的普通 Windows系統的電腦中可直接運行。py2exe的使用方法基本和py2app同樣,可是本人操做時發如今mac中沒法用py2exe打包成exe,可是能夠用pyinstaller打包成exe,沒有嘗試過是否能夠在windows環境下用py2app打包成app。pyinstaller(-F指令下)生成的exe文件,集成了所須要的全部資源(因此exe文件 相對較大),可直接拷貝到其餘電腦中使用。對於py2exe來講,限制就比較多了,它所須要用到的外部資源都在dist目錄下,想要在其餘電腦中使用就必須把整個dist文件夾都拷貝過去。並且經測試在64位機器生成的exe沒法再32位機器上打開使用。github
注:py2app方法已在Mac環境下測試無誤,windows環境操做時若是遇到問題請自行Google, redis
1、安裝py2appwindows
sudo pip install py2app
2、進入要打包的文件所在的文件夾app
cd 。。。。。。。。
3、生成setup.py文件,該文件用於寫打包所須要的依賴ide
py2applet --make-setup xxx.py#xxx.py爲你項目的啓動文件,以後生成的xxx文件就是雙擊執行的app文件
執行之後目錄中會生成setup.py文件,用於寫入依賴的庫。函數
4、在setup.py文件中手動輸入須要的依賴post
若是項目很簡單,沒有導入第三方庫和自建模塊,能夠忽略此步驟。
下面是setup.py文件的一個例子,手動輸入的部分就是在DATA_FILES空列表里加自建模塊的名字,在OPTIONS字典的includes對應的空列表中加第三方模塊的名字
# python自帶的庫無需輸入,第三方庫和本身引入的自寫模塊須要輸入 """ This is a setup.py script generated by py2applet Usage: python setup.py py2app """ from setuptools import setup APP = ['start.py'] #自寫模塊放在DATA_FILES列表中 DATA_FILES = ['xxx1.py','xxx2.py','xxx3.py'] # 第三方庫放在OPTIONS下的includes對應的列表中 OPTIONS = { 'includes': ['sip', 'PyQt5.QtCore', 'PyQt5.QtWidgets'],} setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], )
5、生成app
#本身開發,打包速度快。(由於本機安裝了依賴庫,因此能夠直接運行) python setup.py py2app -A #給其餘沒有sdk的電腦使用,包括lib庫。(沒有安裝sdk的電腦使用,須要去掉-A,將把全部的依賴所有打包。) python setup.py py2app
以後會生成build和dist兩個文件夾,啓動文件在dist下,雙擊就能夠執行。
注:若是發現有問題,在從新進行上述步驟前最好先刪除build和dist兩個文件夾
rm -rf build dist
首先聲明,py2exe在高版本的python環境下可能會出現不支持的狀況,我在打包的時候只支持到python3.4,不清楚目前支持到哪一個python版本。
注:本人在win10下用py2exe打包的含有PyQt5寫界面的程序沒法正常運行,遇到的問題不少,若是程序中用到了PyQt5,推薦選用pyinstaller打包
1、安裝py2exe
pip install py2exe
2、進入項目目錄
cd xxxxxxxxx
3、在項目根目錄中自行建立setup.py文件
該文件的做用與py2app的setup.py文件同樣,只不過須要本身手動建立,區別在於你能夠任意命名該文件(如woshinibaba.py)
4、在setup.py(woshinibaba.py)文件中寫入須要的依賴
文件中基本格式爲
# -*- coding: utf-8 -*- from distutils.core import setup import py2exe setup( # console和windows分別表明控制檯和圖形界面,按需求選擇 #console = [{"script" : 'comtrade.py'}], windows = [{"script":"comtrade.py", "icon_resources": [(1, "logo.ico")]} ], name = 'comtrade',# 生成的exe文件名 version = '1.0', options={}, # 括號內填入的爲項目所需的依賴庫和會形成報錯的文件 data_files={})# 括號內輸入的爲項目所需的依賴文件
# version ,description,name不是必需要寫的。
其餘參數:
typelibs |
列表:須要包含的gen_py產生的typelibs |
具體例子:
# -*- coding: utf-8 -*- # 必須寫的倒入模塊 from distutils.core import setup import py2exe # 能夠不用寫的部分 """ #We need to import the glob module to search for all files. import glob import sys #this allows to run it with a simple double click. sys.argv.append('py2exe') """ # 項目中須要用到的第三方庫寫入includes所對應的列表中 # 項目中用不到的會形成報錯的文件放在excludes所對應的列表中,若報錯的是dll文件,放入dll_excludes所對應的列表中 # 下面是示例: opts= { 'py2exe':{ "includes" : [ "sip", "matplotlib.backends", "matplotlib.backends.backend_tkagg", "matplotlib.figure","numpy", "matplotlib.pyplot", "pylab", "six", "matplotlib.backend_bases", 'scipy.special._ufuncs_cxx', "scipy.integrate","scipy.integrate.quadpack","scipy.sparse.csgraph._validation"], "excludes" : ['_gtkagg', '_tkagg', '_agg2', '_cairo', '_cocoaagg', '_fltkagg','_gtk', '_gtkcairo'], "dll_excludes":['libgdk-win32-2.0-0.dll','libgobject-2.0-0.dll',"MSVCP90.dll",] } } #項目中須要用到的外部文件依賴放入列表中,格式爲[(),(),()] # 元祖中第一個元素是打包時要建立的文件夾名,若是要放在exe文件的同目錄下就用"",第二個元素是該依賴文件的路徑 data_files= [(r'mpl-data',glob.glob(r'C:\Anaconda3\Lib\site-packages\matplotlib\mpl-data\*.*')), #Because matplotlibrc does not have an extension, glob does not findit (at least I think that's why) #So add it manually here: (r'mpl-data',[r'C:\Anaconda3\Lib\site-packages\matplotlib\mpl-data\matplotlibrc']), (r'mpl-data\images',glob.glob(r'C:\Anaconda3\Lib\site-packages\matplotlib\mpl-data\images\*.*')), (r'mpl-data\stylelib',glob.glob(r'C:\Anaconda3\Lib\site-packages\matplotlib\mpl-data\stylelib\*.*')), (r'mpl-data\fonts',glob.glob(r'C:\Anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\*.*')), ("",[r"C:\Anaconda3\Lib\site-packages\PyQt5\libEGL.dll"]), ("platforms",[r"C:\Anaconda3\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll"])] # 將上述參數傳入setup中,console和windows分別表明控制檯和圖形界面,按需求選擇 setup( #console = [{"script" : 'comtrade.py'}], windows = [{"script":"comtrade.py", "icon_resources": [(1, "logo.ico")]} ], name = 'comtrade', version = '1.0', options=opts, data_files=data_files)
5、生成exe
python setup.py app2exe
執行完畢後會生成build和dist文件夾,啓動文件在dist文件夾下
py2exe報錯解決
1. 執行打包命令時報錯 Missing run-py3.5-win-amd64.exe
2. 執行打包命令時報錯 indexError: tuple index out of range
3. 執行打包操做時報錯 (忘了具體報錯信息,意思時遞歸深度超過最大限制)
4. 打包ok,但雙擊可執行文件時報錯 Failed to execute script xxx
5. 打包ok,但雙擊可執行文件時彈窗報錯 This application failed to start because it could not find or load the Qt platform plugin "windows".
注:這是我遇到的一個最大的問題,問題緣由和PyQt5有關目前還沒有找到解決方案,而後選用了pyinstaller
# 注:路徑爲你的python的PyQt5的路徑 data_files=[("", [r"F:\Python\python3\Lib\site-packages\PyQt5\libEGL.dll"]), ("platforms", [r"F:\Python\python3\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll"])]
首先要聲明,pyinstaller在高版本的python環境下可能會出現不支持的狀況,我在打包的時候只支持到python3.5,不清楚目前支持到哪一個python版本。若是你的python已經是3.5以上的版本,建議建立一個虛擬環境後安裝python3.5,再自行安裝上程序所依賴的庫好比requests等等,在新環境中進行打包。
注:pyinstaller方法已在win十、win8和Mac環境下測試無誤,但打包程序自己會由於你的程序的不一樣而須要有些許改動,文章末尾會有一些我遇到過的報錯的解決方法,出現問題可自行Google
1、安裝pyinstaller
pip install pyinstaller
2、切換到工做目錄
cd xxxxxxxxxxx
3、打包命令
與上面兩個不一樣的是,pyinstaller不須要本身寫setup.py文件,只須要在工做目錄中輸入打包命令便可。最後會生成build和dist文件夾,啓動文件在dist文件夾下。
命令格式:
pyinstaller [項目啓動文件]
其餘參數(按需求選擇):
打包完畢後在dist文件夾下雙擊項目啓動文件就能夠了
pyinstaller報錯解決
1.執行打包命令時報錯 IndexError: tuple index out of range
做者建議最好仍是用虛擬環境下的python3.5進行打包。
2.執行打包命令時報錯 ImportError: No module named 'queue'
3.打包命令執行成功,但雙擊可執行程序彈出報錯窗口failed to excute script xxx