pyinstaller模块用于将python项目打包发布成exe文件,以方便地在没有安装python环境的机器上运行。该模块使用 pip install pyinstaller 安装即可。
一、常用参数及含义
参数 | 执行命令 | 含义 |
---|---|---|
-D |
pyinstaller -D demo.py |
默认选项。除了主程序demo.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用。 |
-c |
pyinstaller -c demo.py |
默认选项。使用控制台,只对windows有效。 |
-F |
pyinstaller -F demo.py |
只在dist文件夹中生成一个程序demo.exe文件,适用于没有多依赖.py文件的单个文件。 |
-w |
pyinstaller -w demo.py |
不使用控制台,只对windows有效。 |
-p |
pyinstaller -p D:\project\demo.py |
设置导入路径。 |
-i |
pyinstaller -i D:\icons\demo.ico demo.py |
给生成的demo.exe文件设置一个自定义的图标。 |
二、打包简单的.py文件
对一个简单.py文件,当没有依赖的其他路径下的.py文件、没有间接依赖的其他包、没有依赖的资源文件时,可使用命令pyinstaller –F xxx.py,直接打包成一个exe文件。
示例:一个简单的整数求和小程序
1) 命名calculator.py,写入内容
-
if __name__ ==
'__main__':
-
print(
"求和小程序")
-
a = input(
"请输入第一个数:")
-
b = input(
"请输入第二个数:")
-
print()
-
c = int(a) + int(b)
-
print(
"两数之和为:", c)
-
input()
2) 使用命令pyinstaller -c –F calculator.py直接打包。执行完毕后,程序目录下生成了build、dist两个文件夹和一个calculator.spec文件。生成的exe文件即存在于dist文件夹中。
——dist文件夹,发布目录,存放打包后的exe文件;
——build文件夹,存放一些中间过程文件,可忽略;
——.spec文件,即配置文件,用于打包复杂的python项目。
3) 双击calculator.exe,启动运行
三、由spec配置文件打包复杂的项目
实际的项目往往是复杂的,或有许多依赖的其他路径下的.py文件,或有许多间接依赖的包,或有许多涉及的资源文件,因此,需要通过spec配置文件进行打包发布。
由spec配置文件打包发布完毕后,必定会在dist中生成一个文件夹,里面不只有生成的exe文件,还有许多其他的依赖文件。此模式下,通常使用命令 pyinstaller –D xxx.spec 进行发布。
基本步骤:
s1.生成spec文件:执行命令 pyi-makespec main.py ,执行后生成main.spec文件(main.py是项目启动的入口文件);
s2.完善spec文件中的内容
1) Analysis的第一个列表:填入需要打包的.py文件路径,以字符串形式作为列表元素填入。
注:a.填的路径是绝对路径,目录使用双反斜杠避开转义符;
b.打包操作实质上就是将这些文件直接复制到生成的包中。
2) Analysis的datas列表:填入需要打包的非.py类型资源文件,以元组形式作为列表元素填入,路径写至最后一个目录层级。
注:a.填的路径是绝对路径,目录使用双反斜杠避开转义符;
b.打包操作实质上就是将这些文件复制到生成的包中。
3) Analysis的hiddenimports列表:填入需要直接或间接依赖的一系列包名。
猜测:在pyinstaller打包的过程中,实际上可以包含程序直接依赖的包,但无法包含间接依赖的包,因此需要在hiddenimports列表中配置导入。
写法示例
-
a = Analysis([
'test.py',
-
'D:\\deploy\\a.py',
-
'D:\\deploy\\b.py',
-
'D:\\deploy\\c.py'],
-
pathex=[
'D:\\PycharmProjects\\Test'],
-
binaries=[],
-
datas=[(
'D:\\deploy\\resourceA',
'resourceA'),
-
(
'D:\\deploy\\resourceB',
'resourceB')],
-
hiddenimports=[
'pandas',
'cython',
'sklearn',
'sklearn.metrics',
-
'sklearn.metrics.get_scorer',
'sklearn.metrics.cluster',
-
'sklearn.ensemble',
'sklearn.neighbors.typedefs',
'sklearn.neighbors.quad_tree',
-
'sklearn.tree._utils',
'scipy._lib.messagestream',
'email.mime.message',
-
'email.mime.image',
'email.mime.multipart',
'email.mime.audio',
'email.mime.text',
-
'sklearn.neighbors._typedefs',
'sklearn.utils._weight_vector',
'sklearn.neighbors._quad_tree',
-
'win32timezone'],
-
hookspath=[],
-
runtime_hooks=[],
-
excludes=[],
-
win_no_prefer_redirects=
False,
-
win_private_assemblies=
False,
-
cipher=block_cipher,
-
noarchive=
False)
s3.打包发布
执行命令 pyinstaller –D main.py,dist目录下的main文件夹即发布生成的项目文件。
四、问题处理
1.当双击exe文件无法看到错误信息时,可尝试通过cmd进入对应目录后命令运行:xxx.exe
2.对于hiddenimports里面不知道具体依赖的包有哪些,一个笨办法是,在cmd下执行xxx.exe,根据提示的错误信息,逐一加上缺失的包。
3.杀毒软件可能会干预,最好打包发布前退出杀毒软件。
参考
- https://www.cnblogs.com/milesma/p/12171893.html
- https://blog.csdn.net/weixin_43502949/article/details/101057825?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control
- https://www.tqwba.com/x_d/jishu/162792.html
转载:https://blog.csdn.net/Albert201605/article/details/116659148