Windows下Python程序打包小结

这还是之前的文章,最近发现了,还是存在网上好找些。

当然现在我的观念有点不一样了,纯Windows下桌面应用,还是Winform为首选,遇到复杂动画时用WPF控件。跨平台桌面应用,可以选择MONO,还可以用Boost C++导入Python程序,这比直接打包Python方便,像GUIMiner应该就是:

Windows下Python程序打包小结_第1张图片

记下吧,也会用得上:

Windows不像Linux,没有默认安装Python环境,所以写完的程序要打包发布,如果程序中有需要外置的数据,那么路径就成了个问题,一般都是与可执行程序放在一起。这样就有一个查询可执行程序路径的问题。现小结数种方法如下:


脚本文件为code.py,打包后为code.exe
假定脚本在c:\python\src,
简单打包在c:\python\dist,
单一文件打包在c:\python\dist\bundle


先说简单打包的程序:
*方法1.os.path.realpath(sys.argv[0])
关键在于realpath
>>> c:\python\dist\code.exe


*方法2.sys.argv[0]
>>> c:\python\dist\code.exe


*方法3.win32api.GetModuleFileName(win32api.GetModuleHandle(None)))
>>> c:\python\dist\code.exe


下面看直接双击脚本运行
*方法1还能用
>>> c:\python\src\code.py


*方法2还能用
>>> c:\python\src\code.py


方法3失败
>>> c:\python26\python.exe


再看在命令行窗口中python code.py:
*方法1还能用
>>> c:\python\src\code.py


方法2失败(除非你用python c:\python\src\code.py)
>>> code.py


方法3失败
>>> c:\python26\python.exe


最后看打包成单一文件的执行程序:
*方法1,2,3都可以使用
>>> c:\python\dist\bundle\code.exe


综上所述,方法1是最可移植的方法。只要定义一个函数:
def cwd(): return os.path.dirname(os.path.realpath(sys.argv[0]))
在需要用外部数据的地方加上cwd函数,这样不管是脚本运行还是打包运行就都一样了。例如从打包后的程序用提取图标用作标题栏的图标:


#在调试的时候用系统图标,发布的时候调用应用程序内集成的图标
icoFile = os.path.realpath(sys.argv[0])
if not icoFile.endswith('.exe'): icoFile = os.environ['SYSTEMROOT']+r'\system32\SHELL32.dll'
icon = wx.Icon(icoFile, wx.BITMAP_TYPE_ICO)
self.setIcon(icon)


(而且方法3要注意py2exe与win32api有冲突,至今还没找到打包的方法:(-     )


另外,打包后运行程序时的当前目录就是程序所在目录,所以简单点的话也可以默认用当前目录。但也有例外,比如wx.Icon,用当前目录就无法加载,得用绝对路径。

你可能感兴趣的:(windows,python,python,打包)