学习自:

Python 程序打包成 exe 可执行文件 - 不夜男人

Python生成Windows可执行exe文件 - 韩小北

pyinstaller参数介绍以及总结_BearStarX的博客

0、引言

Python执行时的不同文件:

①.py:源码;需要安装Python和源码依赖的各种库。

②.pyc:py文件的二进制码;发布者不想让源码被运行者看到,作用上同.py,需要安装Python和源码依赖的各种库。

③可执行文件:不同平台上的可执行文件后缀也不同,比如Windows系统下的.exe文件

将Python脚本打包为可执行文件的方式:PyInstaller、py2exe

1、PyInstaller

①使用

假设需要转化为exe文件的文件名为myscript.py

使用前需要先安装PyInstaller库,安装完成后使用PyInstaller的语法为:

pyinstaller [options] script [script...] | specfile

最简单的用法为,在myscript.py同目录下执行命令:

pyinstaller myscript.py

然后就会看到新增加了两个目录build和dist,dist下面的文件就是可以发布的可执行文件,上面的命令执行完毕后可以发现dist目录下有一些文件——库和myscript可执行文件。有时这样会感觉比较麻烦,需要打包dist下面的所有东西才可以发布,万一丢掉一个动态库就无法运行了,好在pyinstaller支持单文件模式,只需要执行:

pyinstaller -F myscript.py

上述命令运行后,你会发现dist目录下只有一个可执行文件,这个单文件就可以发布了,可以运行在你正在使用的OS类似的OS下。当然,pyinstaller还有其他各种选项,例如-d选项用于debug。

当然,即使这样也是有出错的可能性,比如源文件中需要用到某个图片,那么必须把该图片放置到和exe文件同目录下才可以。

在执行pyinstaller命令时,会在和py文件相同的目录下,生成一个.spec文件,该文件会告诉pyinstaller如何处理你的所有脚本,同时包含了命令选项。一般我们不需要理会这个文件,若需要打包数据文件,或者给打包的二进制增加一些Python的运行时选项时……,需要手动编辑.spec文件。可以使用如下代码:

pyi-makespec optionsscript [script...]

创建一个.spec文件,对于手动编辑的.spec文件,我们可以使用下面的任意一条命令:

pyinstaller specfile
pyi-build specfile

②原理

Pyinstaller其实就是把Python解析器与脚本文件打包成为一个可执行文件,和编译成为真正的机器码是两回事,所以打包成一个可执行文件并不会提高运行效率,它的好处在于在运行者的机器上不需要安装python和库。在Linux操作系统下,它主要用的binutil工具包中的ldd和objdump命令。

可以直接发布输出文件夹中的文件或者生成的可执行文件。你只需要告诉用户,你的应用APP是自我包含的,不需要安装其他包,或者某个版本的Python,就可以直接运行了。

需要注意的是,Pyinstaller打包的执行文件,只能运行于和打包时OS同样的OS下,不具备可移植性,如果需要在不同系统上运行,就必须针对该平台进行打包。

③参数

pyinstaller -F -w -p D:\tmp\core-python\libs -i d:\tmp\main.ico myscript.py

注意,每个单个字符都有其对应的全拼写法,二者的区别在于单个字符前边是一个-,而全拼前是两个-即--;此外,所有字符,不论全拼还是缩写的位置都可以任意放置

常用参数

参数

-x -xxx:缩写和全称

说明

-F,-onefile

生成单个可执行文件,只适用于代码都在一个py文件内的情况

-D,-onedir

创建一个目录,包含exe文件,但是会依赖很多文件,适合以框架形式编写代码,易维护

-d,-debug

产生debug版本的可执行文件

-w,-windowed,-noconsole

使用Windows子系统执行,执行时不打开命令行

-p DIR,-path=DIR

自定义需要加载的类路径,一般情况下用不到

-i DIR,-icon=DIR

可执行文件的图标

④补充

Q1:exe文件运行时如何去除弹出的命令行窗口

A:

1、如果是使用.spec文件时,在该文件中找到console=True修改为console=False

2、如果是指定Python文件进行pyinstaller打包的话,需要添加--noconsole

pyinstaller myscript.py --noconsole

如果想只打包为一个exe:

pyinstaller -F myscript.py --noconsole
或
pyinstaller -F -w myscript.py

Q2:如何更换最终exe生成路径

A:

在cmd中,一开始就要通过cd指令(具体用法间见命令行窗口cmd:访问C盘根目录和其他盘 - ShineLe - 博客园)切换到输出文件夹,然后再用上面的代码(不过要注意的是,此时给出py文件时必须以绝对路径的方式,否则会找不到文件)。

Q3:多文件exe的生成

A:

-F只适用于单个py文件生成为exe,如果有多个py文件,彼此间存在依赖关系,就不能用-F了(实际用法中也不用别的参数,只是不用-F就行了)

而是用-D参数,用法和-F相同,也是

pyinstaller -D xxx.py

https://www.2bboy.com/archives/155.html

Q4:py文件中用到了某些图片

A:

需要把py中用到的所有非库文件(图片、txt等)都放在dist目录下,这样才能使用相对路径。更好的做法是,为每种类型或每个功能用到的这些额外的文件在dist目录下单独建立一个文件夹

2、py2exe

(py2exe似乎只支持Python3.3以后的版本)

py2exe是一个将py文件转换为exe的工具。py2exe已经被用于创建wxPython、Tkinter、Pmw、PyGTK、pygame、win32com client、server等。py2exe是发布在开源许可证下的。

①用法

如果想将脚本文件myscript.py转换为exe文件,那么需要额外编写一个用于发布程序的设计脚本,这里假设为文件mysetup.py,那么在其中需要用导入包py2exe,并用setup方法(该方法需要从distutiles.core中导入)构建,具体用法如下:

from distutils.core import setup
import py2exe
setup(console=['C:\Users\...\myscript.py'])
#注意这里应该用绝对路径
#相对路径应该也可以,但是即使这两个文件在同一个文件夹下,仍会显示不存在myscript.py文件
#至于相对路径应该是什么,我并没有探究,有兴趣的可以自己探索一番

然后按照下面的方法运行mysetup.py

python3 mysetup.py py2exe

上边的命令执行后将产生一个名为dist的目录(这个目录在C:\Users\Adminstrator下,让我好找),其中包含了myscript.exe、各种dll、library.zip这些文件。

如果py文件中用了已经编译的C扩展模块,那么这些模块也会被拷贝在各子目录中,同样,所有的dll文件在运行时都是需要的,除了系统的dll文件。dist子目录中的文件包含了你的程序所必须的东西,你应该将这个子目录中的所有内容一起发布。

运行下边的命令,将显示py2exe命令的所有命令行标记:

python3 mysetup.py py2exe -help

②指定额外的文件

一些应用程序在运行时需要额外的文件,诸如配置文件、字体、位图。如果在安装脚本中用data_files可选项指定了那些额外的文件,那么py2exe能将这些文件拷贝到dist子目录中。data_files应包含一个元组(target-dir,files)列表,其中的files是这些额外的文件的列表。

示例如下:

from distutils.core import setup
import glob
import py2exe

setup(console=[r'C:\Users\...\myscript.py'])
data_files=[('bitmaps',['bm\large.gif','bm\small.gif'],('font',glob.glob('font\\*.fnt')))]

代码说明:data_files选项将创建一个子目录dist\bitmaps,其中包含两个.gif文件;一个子目录dist\fonts,其中包含了所有的.fnt文件。