Fre*_*red 3 python pygame pyinstaller
我曾多次尝试使用PyInstaller捆绑我的Python2程序,但它似乎永远不会与Pygame模块一起使用.我在这个主题上看到了许多其他问题,但我找不到任何有用的答案.
有人知道解决方案吗?
我试图在Ubuntu 14.10上这样做.
-编辑-
更具体:
"似乎永远不会工作"意味着当我运行PyInstaller并构建应用程序时,它似乎可以工作并生成应用程序.当您尝试运行该应用程序时,没有任何反应.
Bob*_*igh 11
我在PyInstaller文档中搜索了很多东西,让自己的游戏运行起来.我对Ubuntu了解不多,但是我在Windows中使用了一切,它应该非常相似.这里的关键是让PyInstaller用你的Python代码打包你的资源(图像,声音等).最好的分发是使用pyinstaller --onefile main.py目录中的console命令来获取单个可执行文件.PyInstaller将创建一个dist文件夹和一个main.spec文件..spec文件包含PyInstaller用于制作可执行文件的所有选项.对于--onefile可执行文件,它应如下所示:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['..\\src\\bitmessagemain.py'],
pathex=['C:\\example\\pyinstaller\\bitmessagemain'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
win_no_prefer_redirects=None,
win_private_assemblies=None,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
a.binaries, 'BINARY')],
name='bitmessagemain',
debug=False,
strip=None,
upx=True,
console=False , icon='src\\images\\can-icon.ico')
Run Code Online (Sandbox Code Playgroud)
确保运行一次PyInstaller以使其创建.spec文件,即使生成的可执行文件不起作用.
a是一个收集可放入可执行文件的东西的对象.您想在datas=零件中添加您的资源文件夹.为此,请创建一个列表:
added_files = [
( 'data', 'data' ),
( 'sfx/*.mp3', 'sfx' ),
( 'src/README.txt', '.' )
]
Run Code Online (Sandbox Code Playgroud)
在这个例子中的第一行添加文件夹的所有内容data位于同一文件夹中,你main.spec和main.py它添加到data可执行文件夹里面.您希望保持路径正常工作,因此元组的两个条目通常应该相同.第二行将所有.mp3文件从sfx 添加到exectuable中的sfx文件夹,依此类推.在此列表中添加所有资源,并小心保持路径有效.
然后,您可以修改.spec(标准python代码):
# -*- mode: python -*-
block_cipher = None
added_files = [ #Any variable name works
( 'data', 'data' ),
( 'sfx/*.mp3', 'sfx' ),
( 'src/README.txt', '.' )
]
a = Analysis(['..\\src\\bitmessagemain.py'],
pathex=['C:\\example\\pyinstaller\\bitmessagemain'],
binaries=None,
datas=added_files, #Dont forget to change this line!
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
win_no_prefer_redirects=None,
win_private_assemblies=None,
cipher=block_cipher)
...
Run Code Online (Sandbox Code Playgroud)
最后一个非常重要的步骤是在main.py的开头添加这两行代码:
if getattr(sys, 'frozen', False):
os.chdir(sys._MEIPASS)
Run Code Online (Sandbox Code Playgroud)
这里的技巧是,当您运行可执行文件时,PyInstaller会将所有数据文件解压缩到隐藏的_MEIPASS文件夹中.您希望将当前目录设置为此文件夹,以便代码找到您的资源并且您的路径保持有效.
最后,我建议您将该os.path.join函数用于代码中的所有路径.它将使路径可移植到其他平台.
另外,如果您使用--onedir选项,请执行相同的操作但添加两行:
if getattr(sys, 'frozen', False):
os.chdir(os.path.dirname(sys.executable))
Run Code Online (Sandbox Code Playgroud)
如果执行此操作并且双击(在Windows中)时可执行文件立即关闭,则需要更改console=False到console=True行,然后在StartMenu的搜索字段中键入cmd/k COMPLETEPATHTOYOUREXECUTABLE.这将运行您的.exe并保持控制台打开,以便您可以看到错误日志.它可能会要求你忘记包含一些文件,这样你可以将它添加到.spec,重建你的.exe并重pyinstaller main.spec试.
希望这对其他人也有帮助,对于PyInstaller + Pygame来说,网上的信息非常模糊.
我建议尝试另一个程序,如 py2exe 来捆绑 python 程序,我目前还没有遇到任何问题。他们有很多关于基于 cmd 的过程的优秀 YouTube 视频。我在使用 pyinstaller 时遇到了一些个人问题,并且认为假设您的程序没有缺陷,这只是错误。