鱼C论坛

 找回密码
 立即注册
查看: 6442|回复: 11

[技术交流] 【折腾】使用Pyinstaller发布你的Python!

[复制链接]
发表于 2017-2-20 15:13:12 | 显示全部楼层 |阅读模式

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

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

x
08a9be049b6058a8178c7e0ef3f2a721673ec60b7bcd-2BXFUo_fw658.jpg


在那漆黑的夜里,你敲完最后一行代码,按下最后一次ctrl+ s,调试了最后一遍....
完成!一个栩栩如生的程序就这样跑了起来。
同行之间你或许会做成一个setup.py的方式供他人使用,不过你想在不需要python环境的里面使用,这种方法就不行了。
# 平台Windows。
https://github.com/pyinstaller/pyinstaller

安装方法看首页,提供3种安装方法,pip会自动安装依赖的包,其余两种不会自动安装依赖的包,安装时少哪个包安装一下就可以。
安装完成后会把 python目录/Scripts这个目录自动添加到环境目录,这样可以在命令行下直接pyinstaller,如果没有添加手动添加一下也可以。

0. 我的第一个打包程序。

我们新建一个文件,helloPyinstaller.py
  1. print('hello pyinstaller!')
  2. input()
复制代码

我们在当前文件夹下打开命令行,按住shift然后鼠标右键 360截图20170220145648667.jpg
很方便,也可以新建一个cmd.cmd内容是cmd.exe都可以快速将目录切换到这个文件夹。
360截图20170220145818246.jpg
文件名太长的话tab键是个不错的选择。
我们会看到他打包的信息。
  1. 224 INFO: PyInstaller: 3.3.dev0-56bf488
  2. 225 INFO: Python: 3.4.1rc1
  3. 225 INFO: Platform: Windows-7-6.1.7601-SP1
  4. 226 INFO: wrote F:\Programming Files\packup\helloPyinstall.spec
  5. 228 INFO: UPX is not available.
  6. 230 INFO: Extending PYTHONPATH with paths
  7. ['F:\\Programming Files\\packup', 'F:\\Programming Files\\packup']
  8. 230 INFO: checking Analysis
  9. 231 INFO: Building Analysis because out00-Analysis.toc is non existent
  10. 231 INFO: Initializing module dependency graph...
  11. 244 INFO: Initializing module graph hooks...
  12. 246 INFO: Analyzing base_library.zip ...
  13. 4168 INFO: Processing pre-find module path hook   distutils
  14. 7871 INFO: running Analysis out00-Analysis.toc
  15. 7961 INFO: Caching module hooks...
  16. 7968 INFO: Analyzing F:\Programming Files\packup\helloPyinstall.py
  17. 7972 INFO: Loading module hooks...
  18. 7973 INFO: Loading module hook "hook-distutils.py"...
  19. 7995 INFO: Loading module hook "hook-xml.py"...
  20. 8438 INFO: Loading module hook "hook-encodings.py"...
  21. 8580 INFO: Loading module hook "hook-pydoc.py"...
  22. 8598 INFO: Looking for ctypes DLLs
  23. 8598 INFO: Analyzing run-time hooks ...
  24. 8608 INFO: Looking for dynamic libraries
  25. 9167 INFO: Looking for eggs
  26. 9167 INFO: Using Python library C:\Python34\python34.dll
  27. 9167 INFO: Found binding redirects:
  28. []
  29. 9172 INFO: Warnings written to F:\Programming Files\packup\build\helloPyinstall\
  30. warnhelloPyinstall.txt
  31. 9215 INFO: checking PYZ
  32. 9215 INFO: Building PYZ because out00-PYZ.toc is non existent
  33. 9216 INFO: Building PYZ (ZlibArchive) F:\Programming Files\packup\build\helloPyi
  34. nstall\out00-PYZ.pyz
  35. 10774 INFO: Building PYZ (ZlibArchive) F:\Programming Files\packup\build\helloPy
  36. install\out00-PYZ.pyz completed successfully.
  37. 10791 INFO: checking PKG
  38. 10791 INFO: Building PKG because out00-PKG.toc is non existent
  39. 10791 INFO: Building PKG (CArchive) out00-PKG.pkg
  40. 10814 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully.
  41. 10817 INFO: Bootloader C:\Python34\lib\site-packages\pyinstaller-3.3.dev0_56bf48
  42. 8-py3.4.egg\PyInstaller\bootloader\Windows-64bit\run.exe
  43. 10818 INFO: checking EXE
  44. 10818 INFO: Building EXE because out00-EXE.toc is non existent
  45. 10819 INFO: Building EXE from out00-EXE.toc
  46. 10819 INFO: Appending archive to EXE F:\Programming Files\packup\build\helloPyin
  47. stall\helloPyinstall.exe
  48. 10822 INFO: Building EXE from out00-EXE.toc completed successfully.
  49. 10827 INFO: checking COLLECT
  50. 10827 INFO: Building COLLECT because out00-COLLECT.toc is non existent
  51. 10828 INFO: Building COLLECT out00-COLLECT.toc
  52. 12026 INFO: Building COLLECT out00-COLLECT.toc completed successfully.
复制代码


大部分不用管等他运行完就行了,需要注意的是:
  1. 228 INFO: UPX is not available.
复制代码

UPX是一个将压缩程序,他会极大的压缩文件空间。用了它之后很可能看到体积减少了一半以上的情况,不过没有体积要求尽量不要用。
  1. 9172 INFO: Warnings written to F:\Programming Files\packup\build\helloPyinstall\
  2. warnhelloPyinstall.txt
复制代码

warning信息,大部分是没有用的,如果你去看里面的信息,并且尝试去找一下源文件里怎么写的时候,很可能发现他引入包的时候,
写入类似这样的信息。
  1. import platform
  2. if platform.system() == 'Windows':
  3.     import xxx
  4. else:
  5.     import xxx
复制代码


或者是

  1. try:
  2.     import xxx
  3. except:
  4.     import xxx
复制代码

pyinstaller 在找的时候会尝试全部引入打包,因为不是当前平台的或者可代替的所以没安装找不到会引起一些警告。

360截图20170220150812268.jpg
打包完成呢,你会看到3个文件夹(或两个),一个spec文件被创建了,build文件夹包含了pyinstaller分析你的程序时的临时文件,
dist文件夹是打包的结果。
360截图20170220150930399.jpg
继续深入,一个简单的hello pyinstaller,就给打包了10M文件。唯一的一个exe文件就是运行程序啦。
360截图20170220151104260.jpg

1. 打包成单一文件。
pyinstaller 提供打包成单一文件,-F参数可以让我们打包成一个单一文件。
360截图20170220151232302.jpg
360截图20170220151303451.jpg
只需要4.83M,当你的程序逻辑不复杂,引入包基本不会造成错误时推荐这种方法。

2. 去除黑框从我做起。
当你写了一个打飞机游戏,

                               
登录/注册后可看大图

黑框什么的简直又丑又无用。 你只需要-w参数,这样在打包时用到的引擎就是pythonw.exe,而不是python.exe。

3. Debug。
打包的路上少不了调试,你可能会遇到各种版本操作系统五花八门的错误信息,这种时候不用-w也不能捕获到错误信息(一闪而过),
pyinstaller只是无情的弹出Failed!!!
不过我们可用命令行来捕获,在exe文件目录下打开命令行,运行我们的exe程序,错误信息是标准输出,所以会被命令行捕获到,
这样我们就可以看到出错信息,跟着出错信息一步步找,他少文件就把文件拖到exe目录里。


3. 。
0. 显式的引用模块。否则会找不到喔。
1. 少用UPX,PYQT5如果你尝试用UPX打包,你会发现压缩后的依赖库虽然小了很多,但是会报错。
2. -i 参数可以添加一个图标。
3. -w 可以去除黑框,如果要调试的话请不要带这个参数。
4. 你的资源文件还是需要手动添加到目录里。
5. 如果你发现打包后某些模块丢失,去那个目录里找,少什么就复制过来。
6. 少用中文判断。if xxx='鱼C'时很可能怎么都判断不上。
7. platform判断x64和x86时总会判断成你打包的那个平台的位数。你可以用别的方法,比如判断系统盘里的Program Files (x86)文件夹。
8. 32位python在32位下打包可以兼容大部分平台。
9. 如果没有必要,不必使用最新的python,降版本有时会省去很多烦恼。



评分

参与人数 1荣誉 +20 鱼币 +20 贡献 +10 收起 理由
小甲鱼 + 20 + 20 + 10 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-2-20 16:14:30 | 显示全部楼层
真复杂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 00:50:40 | 显示全部楼层
实用!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-7 13:26:22 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2017-3-7 14:12:20 From FishC Mobile | 显示全部楼层
很不錯,  可以教一下spec內容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2017-7-16 10:17:17 | 显示全部楼层
我用Pyinstaller 打包了pygame 用的指令是 pyinstaller -w -F Game.py 可是打包成的exe只能在自己的电脑上运行,这是为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-17 13:22:12 | 显示全部楼层
zkamsk 发表于 2017-7-16 10:17
我用Pyinstaller 打包了pygame 用的指令是 pyinstaller -w -F Game.py 可是打包成的exe只能在自己的电脑上 ...

这个你最好不加任何命令看看报错信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 15:02:14 | 显示全部楼层
wei_Y 发表于 2017-7-17 13:22
这个你最好不加任何命令看看报错信息。

解决了,我得把exe从dist拉到外面的目录,还得把pygame拷贝过来,就可以传给别人使用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 16:59:42 From FishC Mobile | 显示全部楼层
这玩意非常有用!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2017-8-13 09:38:11 | 显示全部楼层
本帖最后由 Favor 于 2017-8-13 09:41 编辑

楼主,我打包好的文件在本机运行没问题,但是拿到其他电脑上报错:无法定位程序输入点ucrtbase.terminate与动态链接库api-ms-win-crt-runtime-1-1-0.dll上。你遇到过这个情况吗? 无法定位程序输入点ucrtbase.terminate与动态链接库api-ms-win-crt-runtime-1-1-0.dll上.png
补充:是-F单文件下出现这个报错,不加-F就没问题,这个是怎么回事儿呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-13 11:43:22 | 显示全部楼层
Favor 发表于 2017-8-13 09:38
楼主,我打包好的文件在本机运行没问题,但是拿到其他电脑上报错:无法定位程序输入点ucrtbase.terminate与 ...

这个我也不太清楚。
https://www.zhihu.com/question/36384168
https://stackoverflow.com/questi ... -windows-7-machines
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:20:58 | 显示全部楼层
我打包出现语法错误,可是程序可以正常运行,什么鬼啊
4084 INFO: Analyzing F:\code\python\simulate_camera01\RUN.py

Syntax error in F:\code\python\simulate_camera01\RUN.py
  File "c:\program files (x86)\python3.5\lib\tokenize.py", line 397, in find_cookie
     raise SyntaxError(msg)
   File "<string>", line None
SyntaxError: invalid or missing encoding declaration
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 00:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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