(本文在Windows系统下对python程序进行的打包,打包成exe文件,其它系统是否能成功并未测试。)

1.安装Pyinstaller

Python 默认并不包含 PyInstaller 模块,因此需要自行安装 PyInstaller 模块。

安装 PyInstaller 模块与安装其他 Python 模块一样,使用 pip 命令安装即可。在命令行输入如下命令:

pip install PyInstaller

显示Successfully installed pyinstaller就说明安装好了。

2.打包控制台程序

打包分两种情况,一种是打包控制台程序,另外一种是打包GUI程序,因为python程序多为脚本程序,很少会用python去编写界面。这里重点讲解如何打包控制台程序。

打开cmd命令窗口,使用cd命令切换到.py文件所在路径,然后使用以下命令进行打包:

pyinstaller -F 程序文件名.py

以上是最简单的打包方式,上面的打包方式在windows下默认会有cmd窗口,pyinstaller还提供一些可选项进行其它设置;

-无参数,打包成一个文件夹
-D, -打包成一个文件夹,与上面相同
-F, --one-file打包成一个exe文件
-p DIR, --paths DIR添加路径,一般用来添加程序所用到的包的所在位置
-c, --console, --nowindowed提供程序视窗,程序有输入输出的界面,默认
-w, --windowed, --noconsole无视窗,程序后台运行
-i <FILE.ico or FILE.exe,ID or FILE.icns>, --icon <FILE.ico or FILE.exe,ID or FILE.icns>添加icon图标

详细说明:

-w
windows环境下,打包完成我们在执行的时候,会弹出类似cmd的窗口,进行输入输出和交互。但如果你是打包的tkinter这种GUI,那就不需要后台影响美观的黑框了...

(建议一开始打包可以不去掉控制台,运行时可以找到错误)

-F和-D

-D(一个文件夹,多个文件,exe需要同其它文件一起才能执行)在一个文件夹下打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,如果需要维护代码或对其进行更改,推荐使用这种方法,可操控。

-F(多个文件夹,但exe是单独一个文件,可单独执行)如果使用-F参数,则可以将所有依赖打包成一个单独的exe文件(虽然也有一些其它文件附带),对于新手来说我更推荐这个,使用起来更加傻瓜式。

3.打包GUI程序

同样,首先打开cmd命令窗口,使用cd命令切换到.py文件所在路径。

pyinstaller  -F -w 程序名.py

因为窗体程序一般不希望会有控制台出现,所以这里加了-w,可以看到,打包GUI与控制台程序基本是一样的。

4.注意:

1.其他文件夹作为python第三方包导入时,在pycharm中可以直接运行,但是在本路径下打包后得到的文件不可以运行:

这时,将图片等资源文件放入exe统计目录下即可。

2.-p
这个参数如说明所示,虽然pyinstaller可以将代码import导入的依赖包进行打包,但有时,我们自己开发的代码,可能会忽视,那就需要我们通过-p 参数手动引入了.

2.pyinstaller打包的文件有的发现只能在自己电脑上运行,将需要打包的文件复制,存放第三方库的文件夹一般的路径是:安装目录\Lib\site-packages

5.存在报错及解决方法:

最近又执行了一次之前打包的程序,突然就报错了,首先报的这个错误:

Traceback (most recent call last):
  File "c:\users\suda\anaconda3\lib\site-packages\PyInstaller\utils\hooks\__init__.py", line 357, in get_module_file_attribute
    attr = loader.get_filename(package)

AttributeError: 'NoneType' object has no attribute 'get_filename'

。。。中间一大堆报错

PyInstaller.exceptions.ImportErrorWhenRunningHook:

Failed to import module __PyInstaller_hooks_0_numpy required by hook for module c:\users\suda\anaconda3\lib\site-packages\PyInstaller\hooks\hook-numpy.py. Please check whether mod
ule __PyInstaller_hooks_0_numpy actually exists and whether the hook is compatible with your version of c:\users\suda\anaconda3\lib\site-packages\PyInstaller\hooks\hook-numpy.py: You might want to read more about hooks in the manu
al and provide a pull-request to improve PyInstaller.

网上找了很多方法,有说要重装PyInstaller的,有说要装其它依赖包的,但试过了都没能解决问题,最后再一篇博文中看到说他程序里面引用了numpy包,只要将这个包注释掉就不报错了,我程序里面并没有直接引用numpy(但可能其它关联文件引用了),所以也不可能注释。

于是我将numpy卸了重装,问题神奇的解决了。

pip install --upgrade numpy

之后又报错:TypeError: from_buffer() cannot return the address of the raw string within a bytes or unicode object

网上看了一下,可能这是python3.5的bug,问题在于日志信息中的cffi报错,于是重新安装cffi

pip install --upgrade cffi

重装后问题完美解决