Python:构建可执行exe文件
学习自:
Python 程序打包成 exe 可执行文件 - 不夜男人 - 博客园
Python生成Windows可执行exe文件 - 韩小北 - 博客园
pyinstaller参数介绍以及总结_BearStarX的博客-CSDN博客_pyinstaller常用参数
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文件。
Python:构建可执行exe文件的更多相关文章
- python生成可执行exe文件
为什么要生成可执行文件 不需要安装对应的编程环境 可以将你的应用闭源 用户可以方便.快捷的直接使用 打包工具 pyinstaller 安装pyinstaller pip install pyinsta ...
- 将 Python 程序打包成 .exe 文件
1.简介 做了一个excel的风控模板,里面含有宏,我用python的第三方xlwings部署到linux后发现,linux环境并不支持xlwings. Python 程序都是脚本的方式,一般是在解析 ...
- linux上jenkins连接windows并执行exe文件
1.如果要通过ssh的方式来连接windows的话,首先需要在windows上安装freesshd来配置启动.配置ssh(win10上自带了openssh可以进行安装使用,但我机器装不上) 1.1.下 ...
- Python 使用cx_freeze 生成exe文件【转】
Python 使用cx_freeze 生成exe文件 在python中比较常用的python转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller.py2exe恐怕是三 ...
- 把Python项目打包成exe文件
我们很多时候,写好的程序需要打包成.exe文件才可以发给客户,那么今天我就来谈一谈,如何将一个写好的Python程序打包成exe文件! 首先,我们我们使用到的工具是python 3.7 和 Pyins ...
- python代码打包成exe文件
1.准备工作 1.安装pywin32.pyinstaller 2.准备好ico文件 找一个png格式的图片,使用png2ico脚本生成包含以下6个尺寸的ico文件:128×128 64×64 48×4 ...
- Python生成Windows可执行exe文件
环境 python3.6.5 pyinstaller3.5 windows 10 下载地址 python:https://www.python.org/ftp/python/3.6.5/python- ...
- python制作电脑可执行exe文件
python获取IP.主机名.mac地址 关注公众号"轻松学编程"了解更多. 制作get_IP.py文件: import socket import uuid # 获取主机名 ho ...
- python脚本 pyqt 打包成windows可执行exe文件 pyinstaller
今天学习pyqt,做了一些好玩的东西. 好奇之中想试试python脚本编译成可执行文件,一顿查询之后成功了! 我的环境是: windows10 64bit python3.5 pyqt5 ...
随机推荐
- 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.6
公告 我们的群共享文件有备份到 IPFS 的计划,具体时间待定. 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复 ...
- Atcoder ARC-064
ARC064(2020.7.23) A 直接贪心即可. B 手玩样例可以猜出这样一个结论,如果两端字符相同,如果字符串长度为奇数那么后手赢,否则先手赢,两端字符不同则相反.证明的话先从特殊情况开始入手 ...
- 阿里P8整理Mysql面试题答案,助你“脱颖而出”,吊打面试官!(建议收藏)
前言 作为一名开发人员,每天英高都在和数据库进行着斗智斗勇,尤其是互联网行业,对MySQL的使用是比较多的.同样的,因为mysql的重要性以及普及性,在面试的时候一定是一个面试的重点或者说常问问题,说 ...
- Kubernetes:Pod总结(二)
Blog:博客园 个人 承接上文. 在实际的生产使用场景中,直接用 Pod 是不合适的,因为必然会产生单点故障.因此,我们需要有一种方法来方便地创建.管理同一个服务的多个实例 Pod.Kubernet ...
- 防火墙——firewalld
介绍 firewald是对于iptables的一个封装,可以让你更容易地管理iptables规则.firewalld是iptables前端控制器,用于实现持久地网络流量规则. 一.对比 firewal ...
- Mysql一个主一备
Mysql主从复制 -- 一主一备 主从复制原理: Mysql的主从复制是mysql本身自带的一个功能,不需要额外的第三方软件可以实现,其复制功能并不是copy文件实现的,而是借助binlog日志文件 ...
- UITabBarController管理原则
- 基于Autolayout的动画
在修改了约束之后,只要执行下面代码,就能做动画效果 [UIView animateWithDuration:1.0 animations:^{ [添加了约束的view的父控件 layoutIfNeed ...
- sql作业题
作业题:1.查询选修课程'3-105'且成绩在60到80之间的所有记录.注释:用于指定某个范围使用between and,也可以使用and连接符;答案:法1:select * from sc wher ...
- 使用Reachability监测网络变化-陈鹏
在appdelegate里面添加观察者,并启动监测 // 使用通知中心监听kReachabilityChangedNotification通知 [[NSNotificationCenter defau ...