作者:后浪


文章目录

  • 写在前面
  • 一、安装pyinstaller库
  • 二、执行生成exe文件
  • 三、命令分析
  • (一)、基础命令
  • (二)、将库文件单独存放在目录中
  • 四、动态导入的库


写在前面

在B站上看到何冰老师的演讲,深受鼓舞,以下这段话,愿与诸君共享,互勉。

那些抱怨“一代不如一代的人”
应该看看你们
就像我一样
我看着你们 满怀感激

因为你们 这个世界会更喜欢中国
因为一个国家最好看的风景
就是这个国家的年轻人

因为你们 这世上的小说 电影 音乐中表现的青春
不再是忧伤 迷茫
而是善良 勇敢 无私 无所畏惧
是心里有火 眼里有光

...

如果你们依然需要我们的祝福
那么
奔涌吧 后浪
我们在同一条奔涌的河流

python 编译成可信行文件如何保留windows命令行串口 python编写可执行文件_exe

一、安装pyinstaller库

学习编程时,安装解释器和配置相应的编程环境是一件比编程本身还要麻烦的事情,大家都知道。如果我们恰好兴致到时,编写了一个Python代码开发的工具,喜出望外分享给朋友使用时,却苦恼了。因为——我们需要让别人做如下两步:

1. 安装Python解释器
2. 在命令行运行python程序文件,比如: python xxx.py

如果朋友是一个非IT人士,使用这样的工具,就太麻烦了。

如果我们能直接让别人直接双击运行我们的程序就好了。

有没有这样的好事?

还真有!

有几款工具可以把 解释器、Python 代码 和 依赖的库 制作到一个目录中,我们只需要双击其中的 可执行程序,就可以运行我们的Python程序了。
其中 PyInstaller 是目前比较常用的一款。

PyInstaller 支持 Python 2.7 和 Python 3.3 以后的版本。
支持在 Windows, Mac OS X, and Linux 系统上打包出 可执行程序。
PyInstaller库的安装方法如下:

import os
os.system('pip install pyinstaller')

python 编译成可信行文件如何保留windows命令行串口 python编写可执行文件_python_02


当然也可以直接命令行pip安装

pip install pyinstaller

二、执行生成exe文件

假设我们写了一个发送邮件的程序,命名为:

Send_email.py

python 编译成可信行文件如何保留windows命令行串口 python编写可执行文件_编程语言_03

然后我们在该程序的目录下,打开powershell命令行(按住Shift键,鼠标右键单击打开)

python 编译成可信行文件如何保留windows命令行串口 python编写可执行文件_web app_04

打开之后输入如下命令:

pyinstaller Send_email.py --workpath C:\Users\tingy\Desktop\Sendmail --distpath C:\Users\tingy\Desktop --icon="C:\Users\tingy\Desktop\Sendmail\email_ico.ico" --runtime-hook="C:\Users\tingy\Desktop\Sendmail\runtimehook.py

python 编译成可信行文件如何保留windows命令行串口 python编写可执行文件_web app_05

python 编译成可信行文件如何保留windows命令行串口 python编写可执行文件_web app_06

三、命令分析

(一)、基础命令
  • pyinstaller 指定了当前目录需要制作的python文件
  • –workpath 指定了制作过程中临时文件的存放目录
  • –distpath 指定了最终的可执行文件目录所在的父目录
  • –icon="" 指定了应用程序图标,必须是ico格式
  • –runtime-hook="" 将库文件放到单独的一个目录中
  • –noconsole 有图形界面可用该参数去掉DOS黑窗口

(二)、将库文件单独存放在目录中

上面这样操作后,大家可以发现我们只要运行Send_email.exe文件,但是该目录下却有很多其他的.dll 之类的库文件。
这使得我们要寻找并运行程序时,要在这么多文件中找到 .exe 文件,比较费劲。

我们可以通过如下方法,把这些库文件放到 单独的一个 目录中。 这样.exe所在的目录就显得比较清爽了,也好找到.exe文件了。

我们添加一个Python代码文件,名为 runtimehook.py
其内容如下

import sys
import os

currentdir = os.path.dirname(sys.argv[0])
libdir = os.path.join(currentdir, "lib")

sys.path.append(libdir)
#os.environ['path'] += ';./lib'

上面的命令指定 生成的.exe运行时,会先执行 runtimehook1.py 里面的代码。

这样就会指定 .exe 程序所在的目录下面的lib目录:

  • Python库搜索路径,这是由 sys.path.append(libdir) 指定的。
  • 动态链接库文件的 搜索路径,这是由 os.environ[‘path’] += ‘;./lib’ 指定的。

上面的命令执行结束后,我们进入到目录distpath\send-eamil 中,新建一个名为 lib 的目录,把除了下面的几个文件之外的所有其他文件都放到lib目录里面。

base_library.zip  
byhy.exe  
byhy.exe.manifest  
python38.dll

这样,可执行程序的目录就显得清爽多了。

python 编译成可信行文件如何保留windows命令行串口 python编写可执行文件_windows_07

四、动态导入的库

有的时候,我们运行打包好的程序,会出现导入库错误的提示,比如下面

ImportError: could not import module 'PySide2.QtXml'

PyInstaller 没法分析出动态导入的库有哪些,我们可以通过命令行参数 --hidden-import 告诉它。

比如,如果我们运行出现

could not import module 'PySpder.QtXml'

错误 , 就可以这样

pyinstaller httpclient.py  --hidden-import PySpider.QtXml