鱼C论坛

 找回密码
 立即注册
查看: 36249|回复: 49

[作品展示] Python3代码打包教程

[复制链接]
发表于 2015-4-23 22:32:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lightninng 于 2021-11-20 22:26 编辑

2021.11.20重新编辑
时隔多年重新编辑此贴,当初的 py2exe已几乎不用,现在用的最多的还是pyinstaller,主要有点是,相对傻瓜,做小工具的话很方便。现补充第二部分pyinstaller 的使用方法,因为pyinstaller教程更新,所以放在上面。

二、使用pyinstaller打包python 程序
1.pyinstaller的安装

这是一个第三方库,python现在自带的pip命令已经非常强大了,所以命令行中输入下面的指令就行了

  1. pip install pyinstaller -i https://pypi.douban.com/simple/
复制代码

注:【-i https://pypi.douban.com/simple/】这一部分是指使用豆瓣源进行下载,如果你已经配置了pip.ini文件,则可省略。python 的安装和简单配置,之后再开一贴好了


2.pyinstaller的使用

前面我们说过pyinstaller 的使用非常简单,对于本人来说最常见的方式是打包成单个文件。

按住shift键,在我的python代码文件(main.py)所在文件夹中的空白处单击右键,在弹出菜单中选择【在此处打开命令窗口】(win7),如果是win10则选择【在此处打开powershell】,然后键入如下命令:

  1. pyinstaller -Fw main.py
复制代码

然后在漫长的等待之后,同文件夹下会生成三个文件夹,其中dist文件夹下就是我们打包好的程序。


3.关于pyinstaller 命令的参数

在上一部分我们打包程序时实际使用了两个参数,一个F 一个w,当然我们把他写在了一起-Fw,你分开写-F -w也是没有问题的。这其中F参数指打包为单个文件,w为使用窗口模式(直观的理解就是程序运行时不显示控制台的黑色窗口),这是最常用的两个参数。

剩下的参数中比较常用的还有一个i,这个参数是用来设置程序的图标的,使用方法如下:

  1. pyinstaller -Fw -i main.ico main.py
复制代码

其中【-i main.ico】就是指打包程序时用main.ico作为程序的图标,关于图标的部分我们在后面部分还会说到。

其他的参数个人平时用的较少,具体可以百度pyinstaller 参数,很多帖子说的很详细。


4.关于图标

如果是自己写的工具,一般在给别人用时,我会换一个图标,因为pyinstaller 那个默认图标讲真欣赏不来。上一部分我们说了可以用-i参数制定图标,但是实际应用中,会遇到一些问题。首先,图标文件的格式必须是ico,直接用其他格式的图片更改扩展名的方式是行不通的,必须使用图像处理软件(哪怕是美图秀秀都可以)把你的图片另存为ico格式。其次,图标文件的尺寸应该不大于256(这是windows图标最大显示的尺寸)。最后,如果你使用单帧ico文件作为图标,那么在文件夹界面切换显示方式时,大图标会显示不出来,直接显示默认的pyinstaller 打包图标。也就是说小图标时是你的图标,大图标就变成了默认图标,非常难受。

因为,以上三个问题,我们需要一套行之有效的制作图标文件的方法,下面介绍一下我从网上学习之后的制作流程:

####待后完善


一、使用py2exe打包python 程序
以下是我在15年时帖子原文,主要涉及的是py2exe的使用。

先说成功经历:1、打包Python3.3+PyQt5程序2、打包普通程序在他人电脑上运行
再说说打包工具,基本上现在在网上看到就三种,pyinstaller、cxfreeze、py2exe
pyinstaller:没用过不予评论
cxfreeze:用过打包PyQt程序的时候出了些问题,没在其它人电脑上运行过打包的程序
py2exe:这个网上一致评价说不错,但是网上说没有python3的版本而作罢,但是近期找了教程,然后找到了python3版本的py2exe,下面详说

有些鱼油说难,其实打包过程就两步:
1、安装py2exe
2、把改好的setup.py放在你要打包的代码文件同一目录运行
其中,第2步里的setup.py文件,主要是把windows = ['sample.py',]这句中的sample.py改成你要打包的代码文件的名字,其它不动即可,不明白的同学请先看下面的教程再回来看这里

最后教程部分,以下教程基于windows 7 64位,打包过程经python3.3.2+PyQt5验证可用
1、安装部分
(1)py2exe下载网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/
        搜索py2exe,在你搜索到的位置看到这样的条目
        py2exe‑0.9.2.2‑cp34‑none‑win_amd64.whl
        0.9.2.2:py2exe版本号;cp34:python版本号;win_amd64:系统位数
        下载和你的python版本和系统位数相对应的py2exe版本
(2)安装方法:下载好后在命令行下输入 pip install 下载文件绝对路比如你下载在C盘根目录,则输入:
         pip install c:\py2exe‑0.9.2.2‑cp34‑none‑win_amd64.whl
2、打包部分
在你要打包的代码文件(比如sample.py)的同文件夹建立一个python代码文件(比如setup.py),然后在其中输入:
  1. from distutils.core import setup
  2. import py2exe
  3. import sys

  4. #this allows to run it with a simple double click.
  5. sys.argv.append('py2exe')

  6. py2exe_options = {
  7.         "includes": ["sip"],  # 如果打包文件中有PyQt代码,则这句为必须添加的
  8.         "dll_excludes": ["MSVCP90.dll",],  # 这句必须有,不然打包后的程序运行时会报找不到MSVCP90.dll,如果打包过程中找不到这个文件,请安装相应的库
  9.         "compressed": 1,
  10.         "optimize": 2,
  11.         "ascii": 0,
  12.         "bundle_files": 1,  # 关于这个参数请看第三部分中的问题(2)
  13.         }

  14. setup(
  15.       name = 'PyQt Demo',
  16.       version = '1.0',
  17.       windows = ['sample.py',],   # 括号中更改为你要打包的代码文件名
  18.       zipfile = None,
  19.       options = {'py2exe': py2exe_options}
  20.       )
复制代码
3、一些可能出现的问
(1)error: MSVCP90.dll: No such file or directory
解决方法,按如上程序,将该dll写入dll_excludes中。
其他电脑如果无法运行,可能是由于该电脑中没有安装Microsoft Visual C++2008 Redistributable - x86造成的,请到微软官网上下载安装该程序,或将MSVCP90.dll放入dist文件夹(注意:方法未验证)。

(2)error: bundle-files 1 not yet supported on win64
对于64位的Py2exe而言,bundle_files选项目前仍不可用,无法生成为单文件。
有同学提意见说这个选项在64位中只能是3,如果出现这个错误的同学可以尝试,但是本人亲测win7 64位,python3.3.2打包成功,并在别人的电脑上运行过,根据我的系统位数和python版本,我在上面提到的网址下载的py2exe程序是这个
py2exe-0.9.2.2-cp33-none-win_amd64.whl

(3)图标等不显示
网上的一种说法是这是Py2exe打包时没有将其打包进来造成的,可以将“Python\Lib\site-packages\PyQt4\plugins\imageformats”文件夹复制到dist目录下,再执行打包脚本。不过我在实验的过程中并没有发现这个问题。
当然,一定要注意,把你图标按照程序中写的位置放入到dist目录下。否则,当然不会显示。
PS:这里说一下,如果你的程序里面用到了绝对路径类似于"C:\users\user_name\1.txt"这样的,在别人的电脑上运行时必须把这个1.txt放到别人电脑的C:\users\user_name\目录下,这样会非常麻烦,解决办法是在程序的最前方加上这样的语句
  1. import sys, os
  2. sys.path.append(os.getcwd())  # 把当前路径(即程序所在路径)暂时加入系统的path变量中
复制代码
在程序运行期间,系统会把程序所在路径也作为搜索路径,这样可以直接用相对路径就可以了,比如"\user_name\1.txt"就是指你的程序所在路径下的user_name文件夹中的1.txt文件

(4)用命令行执行程序
将setup函数中的windows改为console。

(5)关于PyQt5程序打包时遇到的一些问题
This application failed to start because it could not find or load the Qt platform plugin "windows".
    根据这个贴http://blog.csdn.net/windows_nt/article/details/24205671,将PyQt5目录下的platforms文件夹拷入,在自己的电脑上正常运行;然后将程序(包括新加的platforms文件夹)拷到别人电脑上运行,依然错误根据这个贴http://www.tuicool.com/articles/eqINru,将PyQt5目录下的libEGL.dll文件拷入程序所在目录,运行正常,另外,这个贴子还提到,只保留platforms目录下的qwindows.dll,程序可以运行
在idle里运行正常,但是打包出来的程序运行就直接停止工作
这个问题仅在win764位下打包出现的(在32位系统中运行打包后的程序会提示缺少Qt5Core.dll和Qt5Gui.dll),由于代码中并未用到QtCore和QtGui模块,于是在导入时并未导入,出现这个问题后,经过曲折的过程,终于发现pyqt5的程序,不论你用未在代码中用到QtCore和QtGui都需要将其导入。另外说一下怎么发现这个问题的,我把代码传给Wei_Y小哥,他在自己的机器打包之后运行提示缺少Qt5Core.dll和Qt5Gui.dll,然后他将两个文件加入正常运行,于是我尝试直接将两个模块导入,打包成功。


    综上可以下,对于PyQt5程序打包时,需要注意以下两点:
  • 需要在setup.py文件中的windows = ['sample.py',], 这一句后面加上
  1. data_files=[("",
  2.                    [r"C:\Python33\Lib\site-packages\PyQt5\libEGL.dll"]),
  3.                   ("platforms",
  4.                    [r"C:\Python33\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll"])],
复制代码
setup()函数的data_files参数是一个列表,列表中包含1个或多个元组。元组的第一个元素是一个字符串,表示你准备复制过来的文件所放的文件夹,相对于你的程序所在位置的相对路径(""表示和你的程序在同一目录);元组的第二个元素是一个列表,列表中的元素是你所要放在这个文件夹中的文件的路径(注意,这个路径是指你所要复制的文件所在的位置,需要绝对路径)。所以上面的语句是将qwindows.dll拷贝到程序所在目录下的platforms文件夹中,而将libEGL.dll放在程序所在的文件夹中。
更改后的setup.py如下:
  1. from distutils.core import setup
  2. import py2exe
  3. import sys

  4. #this allows to run it with a simple double click.
  5. sys.argv.append('py2exe')

  6. py2exe_options = {
  7.         "includes": ["sip"],
  8.         "dll_excludes": ["MSVCP90.dll",],
  9.         "compressed": 1,
  10.         "optimize": 2,
  11.         "ascii": 0,
  12.         "bundle_files": 1,
  13.         }

  14. setup(
  15.       name = 'sample',
  16.       version = '1.0',
  17.       windows = ['sample.py',],
  18.       data_files=[("",
  19.                    [r"C:\Python33\Lib\site-packages\PyQt5\libEGL.dll"]),
  20.                   ("platforms",
  21.                    [r"C:\Python33\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll"])],
  22.       zipfile = None,
  23.       options = {'py2exe': py2exe_options}
  24.       )
复制代码

  • 即使你只用到QtWidgets模块,也要同时导入QtCore和QtGui,也就是在代码前面必须加上
    1. import QtWidgets, QtCore, QtGui
    复制代码









评分

参与人数 1荣誉 +10 鱼币 +10 贡献 +5 收起 理由
~风介~ + 10 + 10 + 5 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-23 23:46:58 From FishC Mobile | 显示全部楼层
鱼C论坛就是好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-24 07:47:29 | 显示全部楼层
先在这里留一段时间吧,晚一点我再移动到第三方库子版块里面哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-24 09:38:40 | 显示全部楼层
~风介~ 发表于 2015-4-24 07:47
先在这里留一段时间吧,晚一点我再移动到第三方库子版块里面哦!

好的·:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-24 09:41:18 | 显示全部楼层
不错不错:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-24 15:09:24 | 显示全部楼层
在64bit中"bundle_files": 1,不是一定要設為3嗎?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-24 15:25:35 | 显示全部楼层
学习一下。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-24 21:39:44 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-24 21:46 编辑
kit1858644 发表于 2015-4-24 15:09
在64bit中"bundle_files": 1,不是一定要設為3嗎?

我不知道,你说的很有可能是这样的,但是我的是64位系统,打包成功了。。。用的就是这个脚本~~而且打出来不是单个文件~~
我已测试过,"bundle_files": 1,成功了,我打包时改好的setup.py的代码也贴上面了
谢谢提醒~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-27 08:15:49 | 显示全部楼层
感谢您的分享!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-27 21:31:50 | 显示全部楼层
谢谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-27 22:14:38 | 显示全部楼层
谢谢,不过真的好复杂啊~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-27 23:53:50 From FishC Mobile | 显示全部楼层
好难哦,佩服!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-28 00:08:21 | 显示全部楼层
ft3312591 发表于 2015-4-27 22:14
谢谢,不过真的好复杂啊~~~~

请看新添加的红字部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-28 00:09:00 | 显示全部楼层

请看新添加的红字部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-28 09:51:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-28 10:56:27 | 显示全部楼层
学习了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2015-4-30 00:21:20 From FishC Mobile | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-25 11:39:51 | 显示全部楼层
太给力了,在别的地方找半天都不行,楼主这个教程5分钟搞定!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-21 14:37:00 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-29 15:40:09 | 显示全部楼层
share一下,我用的是python3.5的,但是楼主提供的py2exe下载最新的只有3.4的。为了能够顺利安装,我将whl文件名的"cp34"改成"cp35",然后竟然安装成功....至于能不能用,后面我测试了再跟大伙分享哈,有关信息可以看这个网址http://stackoverflow.com/questio ... ble-with-python-3-5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 20:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表