1.安装

pyinstaller参数 pyinstaller配置pyinstaller参数 pyinstaller配置


pyinstaller参数 pyinstaller配置


pyinstaller参数 pyinstaller配置


使用PyInstaller需要安装PyWin32。

下载与Python对应的PyInstaller版本, 解压后就算安装好了 。

2.生成exe文件

Python程序的目录为 F:hello.py

在命令行 中进入pyinstaller所在的目录,运行python pyinstaller.py F:hello.py

在PyInstaller-2.1目录下,生成文件夹hello

hello目录下有文件

exe文件在dist目录下

如果将python文件到 pyinstaller.py 所在目录下,则运行 python pyinstaller.py hello.py

3. pyinstaller的一些参数

(1) -F 制作的可执行程序,但是,运行生成的exe文件会包含。

PyInstaller是一个用来将Python程序打包成可执行软件的工具,支持 Windows、Linux 和 Mac OS X。生成的可执行软件在没有Python的环境中可以直接运行,方便软件分发,进一步降低使用成本,提升使用效率。

下面演示如何使用 PyInstaller 将程序打包成Windows下的exe软件。

使用pip的方式进行安装,这样可以自动安装其他依赖库。

如果pip还未安装,请参考我的另一篇文章《 Python pip包管理工具 》

在cmd命令行控制台或者VS Code内置的终端输入命令行生成应用,首先将当前路径切换到Python程序所在的路径(如下示例的SubOcr.py文件在python文件夹下的SubOcr文件夹内),然后输入生成应用的命令。

命令执行成功后在 I:workpythonSubOcrdist 文件夹下生成了SubOcr文件夹,里面包含了SubOcr.exe文件。整个SubOcr文件夹就是一个绿色软件,随便移动到任何位置都可运行。

实际上在用pyinstaller命令时会在Python程序的所在路径生成一个后缀为spec的同名文件,然后根据此文件的配置生成应用,这就是PyInstaller的原理。这样做的好处是spec保存了生成应用的配置,每次重新生成应用时可以省略指定参数,尤其是指定了其他的资源、程序库时。我们可以通过以下命令先生成spec文件。

pyi-makespec的命令参数跟pyinstaller的相同,在生成spec文件后可以对其部分选项进行编辑(可以用VS Code或自带的记事本编辑),添加更多参数,然后再用pyinstaller命令生成应用。

spec文件的主要选项:

上面示例的SubOcr用到了opencc和opencv-python,其中opencc下的数据文件和opencv-python下的dll文件在生成应用时不会自动导入(缺少这些文件应用无常使用),因此需要在spec文件中指定路径。对spec文件的修改如下:

以上便是PyInstaller打包Python程序的全过程,如果在此过程中遇到问题,可以在评论区留言,定当知无不言,言无不尽。

可以使用PyInstaller把python程序打包成exe,安装使用pip install pyinstaller,使用时,使用pyinstaller打包,参数如下

-F, –onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用

-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较这样,代码易于维护

-K, –tk 在部署时包含 TCL/TK

-a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.

-d, –debug 产生debug版本的可执行文件

-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)

-c,–nowindowed,–console

使用控制台子系统执行(默认)(只对Windows有效)

pyinstaller -c xxxx.py

pyinstaller xxxx.py --console

-s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.

-X, –upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)

-o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.

-p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源

–icon=

将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py

–icon= 将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)

-v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)

-n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,个脚本的主文件名将作为spec的名字

pyinstaller 打包多个资源文件到一个可执行文件

设 main.py 脚本调用 bank.txt视频文件(main.py和bank.txt在同一级目录),那么将在main.py脚本需要这样写:

将多个资源文件都打包成一个文件,会临时进行解压,解压的目录为: C:Users用户名AppDataLocalTemp 随机目录名, 而我们找到这个目录就需要 sys._MEIPASS 这个属性数值,而如果没有这个属性的普通运行情况 会返回 os.path.dirname(os.path.abspath(__file__)) 也就是普通寻找文件的情况。

注意: –add-data : 个参数 是要添加文件或路径 bank.txt;. = bank.txt + ; + . ,然后是一个分割符 在windows上是 ; linux上是 : 参数是 . 也就是打包后存在的路径,解压后的路径。在.spec里面结构如下:

你也可以通过 pyi-makespec 来生成 spec文件,然后进行修改。

python-pyinstaller、打包后获取路径、读取同路径的配置文件

使用pyinstaller可以把.py文件打包为.exe可执行文件,命令为:

打包后有两个文件夹,一个是dist,另外一个是build,可执行文件在dist文件夹里面,但是会有许多依赖是文件存在

使用-F参数后,打包的可执行文件是一个整体,只有一个.exe文件。

获取文件路径的方式有四种,可以在打包成exe文件后,获取.exe文件的当前路径

在ide界面的执行结果如下:

在exe文件的执行结果为:我是把exe文件放到桌面运行的。

首先安装pyinstaller:7827835传统方式:通过命令提示符cd到该解压的(和setup.py同一目录),然后输入pythonsetup.pyinstall或者直接在命令提示符中输入pipinstallpyinstaller通过piplist可以查看你所有安装的包以及包的版本

开始打包成exe1、命令提示符cd到需要打包的文件的目录,直接在命令提示符中输入pyinstaller-F文件名.py注意F要大些,呵呵就这么简单

打包成功后会出现两个文件夹,其中一个就是所需要的exe文件;

注:若是gui文件可以在输入pyinstaller-F-w文件名.py其中w是小写,意思就是五命令行窗口,默认的是-c有命令行窗口,当然一般的文件也可以-w,这样命令行窗口就没有了。pyinstaller的其他常用的参数--icon=图标路径-F打包成一个exe文件-w使用窗口,无控制台-c使用控制台,无窗口-D创建一个目录,里面包含exe以及其他一些依赖性文件还有一些可以通过pyinstaller-h来查看参数。

用 pyinstaller、-F -w等打包方式生成 exe 后,都出现错误可能的原因以及解决措施如下:

1.如果你用的第三方模块是用vc2008 sp1 express编译的话。可能会碰到一个BUG。据说是因为vc2008 sp1在manifest文件写的是原版crt的版本号,但是实际上用的是新版本的crt。

2.你可以让用户安装msvcrt看看。只带动态链接库的话,解决办法比较麻烦,要改manifest的版本号。

1、如果你用的第三方模块是用vc2008 sp1express编译的话。可能会碰到一个BUG。

2、据说是因为vc2008 sp1在manifest文件写的是原版crt的版本号,但是实际上用的是新版本的crt。

3、你可以让用户安装msvcrt看看。只带动态链接库的话,解决办法比较麻烦,要改manifest的版本号。