欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows环境打包python工程为可执行程序

程序员文章站 2022-03-10 21:23:51
...

此次博客的目的是记录我怎样用pyinstaller打包我用python开发的工程,在网上搜索了很多资源,基本上都是不全的,所以我在这儿记录一下这个比较完整的过程。


前言:概述一哈,我的开发环境是windows7,然后系统是64位,安装的python和wxpython都是32位的(为什么要安装32位,因为32位的安装包开发的程序到时候既可以在64位操作系统上运行,也能在32位系统上运行,但是如果安装64位的话到时候只能在64位系统上运行)。

1、安装包连接如下,大家也可以去其他地方下载安装包:

Python和wxpython安装包,都是32位的
https://download.csdn.net/download/u013896064/10508476

安装好python和wxpython后就可以在window上开发界面程序了。

2.1首先需要安装pywin32

2、如果此时你的界面程序已经开发完成,我们就开始怎么打包整个工程为可执行程序吧

2.1 首先需要安装pywin32

但是我们电脑可能基本都没有安装pip,所以我们继续安装pip(pip的安装包和pywin32的安装包的连接如下:https://download.csdn.net/download/u013896064/10508502)
下载下来后,将pip的安装包解压到C盘,然后命令行进入到pip目录,如下图所示:
 Windows环境打包python工程为可执行程序
然后执行命令:python setup.py install 
等待pip安装完成,此时pip已经安装完成,但是此时输入pip命令找不到,原因是还需要配置环境变量,在环境变量path下面添加C:\Python27;C:\Python27\Scripts,入下图所示,环境变量之间需要用分号隔开,注意是英文的分号儿不是中文的分号:
 Windows环境打包python工程为可执行程序
点击确定后重新进入cmd控制台就可以使用pip命令了
然后我们就用pip来安装pyinstaller,进入cmd控制台输入如下命令:pip install pyinstaller
等待安装完成后,pyinstaller就安装完成了

你可以在命令行敲命令pyinstaller检测是否安装成功,不成功的话运行起来会提示命令不存在不是内部命令这个也是需要跟你安装的wxpython和python的对应起来,要么都是63位的,要么都是32位,切记必须一致,我这次用的是32位的,所以pywin32也需要32位的。(安装pywin32的作用是为后面安装pyinstaller提供依赖包)

2.3然后此时我们就可以使用pyinstaller命令来打包我们开发好的python工程了

具体步骤如下:
首先介绍哈pyinstaller的参数
-F 表示生成单个可执行文件
-w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!
-p 表示你自己自定义需要加载的类路径,一般情况下用不到
-i 表示可执行文件的图标

我这次没有用的第三方的库或者包,所以参数-p我就不需要用了
我这里详细说哈怎么打包工程,工程包括图片啊,数据库文件夹之类的怎么打包,单个的打包我就不说了。
A:首先在cmd命令行进入你程序的目录内,假设你的python入口文件是main.py文件,然后进入执行打包命令:pyinstaller -w -F main.py

打包成功后,在该工程目录下面会多两个文件夹,一个build,一个dist,然后我们的exe文件就在dist目录下面,名字为main.exe


执行完成后如果你工程下面还有好几个目录的话此时exe是运行不成功的,需要修改spec文件,假设你还有文件icon文件夹存放图片和database文件夹存放数据库
B:在工程项目里执行完打包命令后会生成一个文件叫做main.spec,用任何一个文本编辑工具打开这个文件,样本如下
# -*- mode: python -*-

block_cipher = None


a = Analysis(['main.py'],
             pathex=['C:\\Users\\jelly\\Desktop \\DataClean'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
             

pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='main',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

修改如下,修改的操作就是添加了你的database文件夹和icon文件夹,然后保存

# -*- mode: python -*-

block_cipher = None


a = Analysis(['main.py'],
             pathex=['C:\\Users\\jelly\\Desktop \\DataClean'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
             
dict_treeicon = Tree("C:\\Users\\jelly\\Desktop \\DataClean\\icon",prefix="icon")
a.datas += dict_treeicon
dict_treebase = Tree("C:\\Users\\jelly\\Desktop\\ DataClean\\database",prefix="database")
a.datas += dict_treebase

pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='main',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )
然后保存退出再在命令行执行命令:pyinstaller mian.spec
执行此命令后你的exe程序已经重新生成过一次,你回看到此时exe的大小比之前的要大,因为打包了那两个文件夹的内容进去,此时你再去执行exe文件就可以正常运行了

到此我的记录到此为止了,哎,下班了都已经。。。