Crossin的编程教室

标题: 将打飞机游戏打包成 exe [打印本页]

作者: crossin先生    时间: 2016-1-2 22:40
标题: 将打飞机游戏打包成 exe
打飞机游戏相关资源:

代码+图片:
百度网盘
http://pan.baidu.com/s/1dEvTZcX

cxfreeze.bat
pygame2exe.py
见本楼末尾,需登录可下载

关于打包:
【转】利用cx_Freeze将py文件打包成exe文件(图文全解)
http://crossin.me/forum.php?mod=viewthread&tid=5486&fromuid=3
【转】用Python和Pygame写游戏-从入门到精通(py2exe篇)
http://crossin.me/forum.php?mod=viewthread&tid=5487&fromuid=3




发现很多朋友在写了 pygame 的打飞机游戏之后,都很想打包成 exe 文件分享给别人玩。但是在打包的过程中,可能遇到一些问题。今天我就来整理一下 pygame 打包 exe 的一些注意事项。

另外,pygame 打飞机游戏的相关资源,包括图片和代码,我放在了论坛的帖子里,需要的朋友可去下载。

在这里,我介绍两种较为常见的打包 exe 工具,cx_freeze 和 py2exe。先说 cx_freeze

cx_freeze 打包的过程比较简单,安装好之后运行一条命令就可以了。基本步骤就是:

1.搜索并下载符合你 python 版本的 cx_freeze

当前最新版本:
https://pypi.python.org/pypi?:action=display&name=cx_Freeze&version=4.3.4

一定要选择符合的版本,包括操作系统、系统位数、python版本。

2.安装

3.配置 cxfreeze.bat,确保 cx_freeze 命令可执行

如果正确安装,则在命令行中运行
cxfreeze -h
可以看到一长串的使用说明。否则会提示“系统找不到指定的路径”。

安装完无法正确执行的话,到你的 python 安装文件夹,假设为 C:\Python27\,下面的 Scripts 文件夹中,找到 cxfreeze.bat 文件。如果没有就手动增加一个。

确认其中的内容确实指向正确的文件(那句命令是在一行里,手机上看会换行):
@echo off

C:\Python27\python.exe C:\Python27\Scripts\cxfreeze %*


重新打开命令行,如果执行 cxfreeze 仍然不成功,试着将 C:\Python27\Scripts 加入环境变量 Path,或者直接使用完整路径,即:
C:\Python27\Scripts\cxfreeze -h

4.执行打包命令
cxfreeze mygame.py
C:\Python27\Scripts\cxfreeze mygame.py

mygame.py 是你要打包的主文件或启动文件,要替换成对应的文件名。

默认会生成打包好的 exe 文件在 dist 文件夹中。打包过程完成。

着重说一下几个需要注意的点,和常见问题:

1.cxfreeze的版本
很多打包中的诡异问题,比如提示中说到 sys 相关模块有错误之类,很可能都是因为使用了错误的版本。这常常由于在安装 python、pygame、cxfreeze 的时候,其中某个选择了64位的版本,而另一个又是32位的原因。因此,在不是很确定版本的情况下,我的建议是,统一选择 win32、python2.7 相对应的版本。这是兼容性最大的选择。即使你的电脑是64位系统,仍然可以正常运行32位程序,反之则不可以。

2.点击打包好的 exe 一闪而过
这通常是发生了错误,程序关闭。要想知道错误原因,可在命令行下,到文件所在目录执行 mygame.exe,则可以看到报错信息。

而正常的打包程序,执行完之后也会立即关闭窗口。如果想让窗口停留,可以在程序末尾加上一句
raw_input("press any key to exit...")
让程序阻塞在等待输入的状态。

3.Couldn't open xxx.jpg
这是打包后的程序找不到所需要的资源,因为资源原本是相对于 py 代码文件的路径。打包后,需要保证从 exe 文件的相对路径能正确找到图片文件。通常就是把图片复制到 exe 所在文件夹中。

4.如果不想要程序背后那个黑色的命令行窗口,可以在打包时加上参数 --base-name,如:
cxfreeze mygame.py --target-dir dist --base-name=123


再来说下 py2exe

py2exe比较麻烦的地方在于,打包需要提供一个配置文件。我找了一个针对 pygame 打包的配置文件,同样附在论坛上。(文件来自 目光博客http://eyehere.net/2011/python-pygame-novice-professional-py2exe/

打包步骤:

1.搜索并下载符合你 python 版本的 py2exe
当前最新版本:
http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/

一定要选择符合的版本,包括操作系统、系统位数、python版本。同样,建议 win32、python2.7。

2.安装
安装好之后,在 python 命令行下运行 import py2exe,不会报错。

3.修改配置文件,把其中的
self.script = "mygame.py"
改成你的代码主文件或启动文件。

4.执行打包命令
python pygame2exe.py

后面那个文件就是你修改后的配置文件。运行成功则打包完毕,exe 文件默认也是在 dist 文件夹中。

额外的注意事项:

1.如果打包后执行 exe 出错,问题会记录在 mygame.exe.log 中。

2.我在打包时,出现了一个莫名错误:
RuntimeError: EndUpdateResource: 系统无法打开指定的设备或文件。
后来在网上搜索了下,结论是:关闭xx管家/xx安全卫士之类的软件,就可以成功打包了。

关于 cx_freeze 和 py2exe 的详细配置,我会在论坛里转载两篇相关文章供参考。各位也可以在搜索引擎里寻找相关资料。

qrcode_for_gh_5ffd8141d976_258.jpg

pygame-plane.zip

40.84 KB, 下载次数: 63

cxfreeze.bat

66 Bytes, 下载次数: 69

pygame2exe.py

6.36 KB, 下载次数: 63


作者: 大懒虫    时间: 2016-3-25 14:04
Fatal Python error: (pygame parachute) Segmentation Fault
用cxfreeze 打包后出现这个问题,请问如何解决
作者: Kunz    时间: 2016-3-25 16:33
老师,这是什么情况??

QQ图片20160325163322.png (33.59 KB, 下载次数: 847)

QQ图片20160325163322.png


作者: crossin先生    时间: 2016-3-25 16:38
大懒虫 发表于 2016-3-25 14:04
Fatal Python error: (pygame parachute) Segmentation Fault
用cxfreeze 打包后出现这个问题,请问如何解 ...

不太清楚。可能是版本/系统不兼容造成的问题。
作者: crossin先生    时间: 2016-3-25 16:41
Kunz 发表于 2016-3-25 16:33
老师,这是什么情况??

不知道具体原因,看上去是没找到pygame模块,或者也是因为版本兼容问题造成
作者: 大懒虫    时间: 2016-3-25 16:45
crossin先生 发表于 2016-3-25 16:38
不太清楚。可能是版本/系统不兼容造成的问题。

老师,我用cxfreeze 生成打飞机09版本的就可以打开,生成12版本(最终版)的就打不开了,出现了这个错误
Fatal Python error: (pygame parachute) Segmentation Fault

作者: Kunz    时间: 2016-3-25 16:58
我又尝试用了一下py2exe打包,打包成功后,点击exe文件,还是错误,出现RuntimeWarning: import display: No module named _view
作者: Kunz    时间: 2016-3-25 17:00
大懒虫 发表于 2016-3-25 16:45
老师,我用cxfreeze 生成打飞机09版本的就可以打开,生成12版本(最终版)的就打不开了,出现了这个错误
...

版本是指哪个版本啊??

作者: 大懒虫    时间: 2016-3-25 17:03
Kunz 发表于 2016-3-25 17:00
版本是指哪个版本啊??

老师的12个教程的版本
作者: 大懒虫    时间: 2016-3-25 17:04
Kunz 发表于 2016-3-25 17:00
版本是指哪个版本啊??

就这个

捕获.PNG (21.27 KB, 下载次数: 833)

捕获.PNG

捕获.PNG (21.27 KB, 下载次数: 818)

捕获.PNG


作者: Kunz    时间: 2016-3-25 18:21
大懒虫 发表于 2016-3-25 17:04
就这个

哦,谢谢

作者: 15152347277    时间: 2017-1-2 14:31
cxfreeze打包成功了但是运行不了.
Fatal Python error: (pygame parachute) Segmentation Fault

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
作者: crossin先生    时间: 2017-1-2 19:14
15152347277 发表于 2017-1-2 14:31
cxfreeze打包成功了但是运行不了.
Fatal Python error: (pygame parachute) Segmentation Fault

这个看不出来
一方面你先确认 python pygame 和 cxfreeze 的版本和位数是否一致,最好建议都用2.7,32位。
另外就是代码里可能有部分功能和系统不兼容,常见有可能是字体的问题。这个需要调试,方法是去掉部分代码,看程序是否能成功打包运行,最终找到出错的代码是哪里

作者: 张仪舌在    时间: 2017-3-21 11:29
请问这个生成在DIST目录下的EXE文件怎么进行移植啊,为什么我换个目录都会各种报错,应该怎么设置让它具有可移植性啊谢谢!
作者: crossin先生    时间: 2017-3-21 21:22
张仪舌在 发表于 2017-3-21 11:29
请问这个生成在DIST目录下的EXE文件怎么进行移植啊,为什么我换个目录都会各种报错,应该怎么设置让它具有 ...

是要整个 dist 目录发给别人玩的。可以打个压缩包
作者: Kunz    时间: 2017-4-2 18:09
终于成功了!!!一年前没成功的这次终于打包成功!!
作者: chj1027    时间: 2017-7-4 09:36
Kunz 发表于 2017-4-2 18:09
终于成功了!!!一年前没成功的这次终于打包成功!!

你是用什么打包成功的啊?
作者: qtjason    时间: 2017-8-25 16:25
先生,cx_freeze也出现Fatal Python error: (pygame parachute) Segmentation Fault This application has requested the Runtime to terminate it in an unusual way.
这个问题。查找资料后,我将font内容去掉就可以顺利运行exe了,但不是很清楚这个font在打包过程中出了什么问题。
作者: crossin先生    时间: 2017-8-26 13:01
qtjason 发表于 2017-8-25 16:25
先生,cx_freeze也出现Fatal Python error: (pygame parachute) Segmentation Fault This application has  ...

应该是缺少字体文件,不同系统字体文件不一样
作者: haohonglee    时间: 2017-8-31 21:09
请问C先生,学习python到什么程度就可以开始着手练习打飞机游戏?
作者: crossin先生    时间: 2017-9-1 10:14
haohonglee 发表于 2017-8-31 21:09
请问C先生,学习python到什么程度就可以开始着手练习打飞机游戏?

把python基础有所了解,至少学完函数、列表、面向对象
作者: skybeak    时间: 2018-3-16 10:12
本帖最后由 skybeak 于 2018-3-16 10:14 编辑

老师 您好,我是安装的cx_freeze,安装成功了,将咋们原来的一些点球游戏打包成功可以运行。但这个打飞机游戏打包成exe后无法运行,一开始是图片的引入用了相对路径报错,我改成绝对路径后不报那个错了,又成了这个错,请问老师是什么错,有什么思路么?


D:\1.png

1.png (19.94 KB, 下载次数: 603)

1.png


作者: crossin先生    时间: 2018-3-16 17:32
skybeak 发表于 2018-3-16 10:12
老师 您好,我是安装的cx_freeze,安装成功了,将咋们原来的一些点球游戏打包成功可以运行。但这个打飞机游 ...

从这个报错看不出来。去掉部分代码打包,逐步定位问题
作者: 迷茫的青年    时间: 2018-3-16 17:43
请问cross 先生
我打包成功后,运行exe出现
javascript:;
line 95是
javascript:;
这一行
有什么问题吗?
是因为用了汉字吗?

QQ截图20180316173537.png (17.96 KB, 下载次数: 717)

QQ截图20180316173537.png

QQ截图20180316174258.png (2.79 KB, 下载次数: 718)

QQ截图20180316174258.png


作者: crossin先生    时间: 2018-3-17 15:11
迷茫的青年 发表于 2018-3-16 17:43
请问cross 先生
我打包成功后,运行exe出现
javascript:;

看报错是font的问题,字体文件没找到,不确定是不是中文引起
作者: skybeak    时间: 2018-3-19 09:42
crossin先生 发表于 2018-3-16 17:32
从这个报错看不出来。去掉部分代码打包,逐步定位问题

好的 谢谢老师,我按方法试试。
作者: leopotter6    时间: 2018-5-4 22:10
crossin先生 发表于 2017-8-26 13:01
应该是缺少字体文件,不同系统字体文件不一样

请问老师 应该怎么解决?
作者: leopotter6    时间: 2018-5-4 23:24
crossin先生 发表于 2018-3-17 15:11
看报错是font的问题,字体文件没找到,不确定是不是中文引起

老师我把python pygame cxfreeze都重新装了一遍(装成了32位的)
转换之后在命令行运行打飞机的exe程序,仍然报错(如图),这是怎么回事呢?

报错.png (62.65 KB, 下载次数: 730)

报错.png


作者: crossin先生    时间: 2018-5-5 15:19
leopotter6 发表于 2018-5-4 23:24
老师我把python pygame cxfreeze都重新装了一遍(装成了32位的)
转换之后在命令行运行打飞机的exe程序, ...

无法帮你定位
你从最简单的hello world尝试打包,然后逐步添加你的代码打包。看报错出现在哪一个部分
作者: ericlinmk2    时间: 2018-8-19 19:59
太好了  我已經成功打包,也可玩打飛機了
謝謝先生

但请问C先生,為什麼用python執行打飛機時,敵人飛的速度很正常
但打包後,敵人的速度就快了三四倍?
作者: crossin先生    时间: 2018-8-21 15:02
ericlinmk2 发表于 2018-8-19 19:59
太好了  我已經成功打包,也可玩打飛機了
謝謝先生

不同环境下帧率是不一样的
但你按照每帧移动固定距离,就会出现速度不一样

正式的做法,是要乘上每帧消耗的时间,以保证不同环境下速度一致
作者: 简言    时间: 2018-11-26 22:42
qtjason 发表于 2017-8-25 16:25
先生,cx_freeze也出现Fatal Python error: (pygame parachute) Segmentation Fault This application has  ...

兄弟我也是这个问题啊,怎么去掉的




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5