前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python打包exe文件方法汇总【4种】

Python打包exe文件方法汇总【4种】

作者头像
全栈程序员站长
发布于 2022-08-11 13:01:15
发布于 2022-08-11 13:01:15
3.1K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。


title: Python打包exe文件方法 copyright: true top: 0 date: 2018-08-11 21:08:21 tags: 打包 categories: Python进阶笔记 permalink: password: keywords: description: 使用py2exe,pyinstaller,cx_Freeze,nuitka对python文件进行打包,尝试进行混淆代码。

“乔治是世界上最后一只平塔岛象龟,而我是世界上最后一个源家后裔,最后一只平塔岛象龟应该为了种族不灭努力地繁殖后代,最后一个源家后裔应该重振家族在黑道中的威望,但是乔治只是想回自己的水坑里去打滚,而我只是想去天体海滩上卖防晒油。”源稚生盯着恺撒的眼睛,“我就是这种人,其实蛇岐八家的黑道事业和秘党的使命对我来说都不重要,我的人生理想就是去卖防晒油。我跟你叔叔不是一种人。”

Python作为解释型语言,发布即公开源码,虽然是提倡开源但是有些时候就是忍不住想打包成exe,不仅仅是为了对代码进行加密,而是为了跨平台。防止有些没有安装py环境的电脑无法运行软件。

目录对python代码打包成exe的方式有4种,py2exe,pyinstaller,cx_Freeze,nuitka,分别对以上4种方法介绍,欢迎纠错和提供新的办法。

py2exe

介绍

py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序。

优点:

  1. 可以把python打包成exe

缺点:

  1. 打包好的 exe只能在相同的系统下运行,比如你在XP系统用py2exe打包好的exe只能在XP上运行,在win7上肯定有问题,而且也是存在在别的XP机子上也可能不能运行,因为一些别的机子可能会缺少dll文件什么的,作者我当时之所以抛弃py2exe 也是因为这个原因;
  2. 打包的文件也需要打包同exe下的dll,和一些库的压缩包,不然exe根本跑不起来
  3. 打包时候报始终报RuntimeError: BeginUpdateResource错误,就需要拷贝dll文件。C:\WINDOWS\system32\python27.dll复制到dist目录
  4. 总之毛病一大堆,基本上已经舍弃了

使用

下载地址

安装好后,准备进行打包

准备一个文件x.py,这个x.py就是想要打包成exe。

然后这x.py同目录下新建一个setup.py,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#coding=utf-8
from distutils.core import setup
import py2exe
includes = ["encodings", "encodings.*"]
#要包含的其它库文件
options = {"py2exe":
  {
    "compressed": 1, #压缩
    "optimize": 2,
    "ascii": 1,
    "includes": includes,
    "bundle_files": 1 #所有文件打包成一个exe文件
  }
}
setup (
  options = options,
  zipfile=None,  #不生成library.zip文件
  console=[{"script": "x.py", "icon_resources": [(1, "Q.ico")] }]#源文件,程序图标
)

然后这cmd窗口下运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python setup.py py2exe

py2exe使用方法 (含一些调试技巧,如压缩email 类)

pyinstaller

PyInstaller除了win32平台外还支持Linux,Unix平台.py2exe的用法在前面的博文里已经有了,现在看看PyInstaller,pyinstaller是目前应用最多的python打包工具,也是我最常用的。

PyInstaller本身并不是Python模块,所以安装时随便放在哪儿都行。

优点:

  1. 可将python文件转成可执行文件
  2. 跨平台
  3. 输出的可以是单一目录,也可以是一个单独的打好包的可执行文件。py2exe貌似输出目录。
  4. 智能支持python的第三方模块如PyQt,外部数据文件等
  5. 支持EGG格式文件
  6. 可执行文件可以用UPX压缩,二进制压缩方式
  7. 支持控制台和视窗两种方式。
  8. 可以选择exe文件的图标 (Windows only)
  9. 支持 COM server (Windows only)

缺点:

  1. import导入的问题

pyinstaller是很智能的,只要指定了入口py文件,那么它就会根据代码自动查找需要导入的包。但是隐式导入的话,平常运行是没有问题的,举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# test1.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
 
 
DB_CONNECT_STRING = 'mysql+pymysql://root:123456@localhost/study'
engine = create_engine(DB_CONNECT_STRING, echo = False)
DB_Session = sessionmaker(bind = engine)
session = DB_Session()
 
print('this is my test')

运行这个ORM库的初始化引擎,是没有问题的,在console得到结果: this is my test

那么我们开始打包,使用最简单的pyinstaller test1.py。打包完成后,在当前目录下有个dist文件夹,进入dist下的test1文件夹,然后打开cmd,运行这个exe,我们就会发现:

提示: no model named ‘pymysql’

这是怎么回事呢?那么问题来了,sqlalchemy这个库在初始化的时候是不需要显示导入引擎库的,它自己有一个create_engine()的函数来初始化,这个字符串是使用者根据规则来自己填写的。其实解决的方法很简单,我们只要在显式导入pymysql这个库即可。现在我们导入这个库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pymysql

重新打包一遍(重新打包的时候记得删除掉spec文件,否则会有缓存,或者是加上–clean选项清除掉),再次运行,现在就没有这个问题了。

  1. 多进程打包的问题

官方的CPython存在一个GIL锁,这个锁的存在有很多优点,很多库都是线程安全的,单线程执行的效率也高。在python早期的一个版本中取消掉了GIL,代之以高粒度的锁来实现多线程,但是实际应用中单个线程的效率大大降低。故后来又将GIL这个锁还原回去,所以至今的python2也好还是python3中都会有这个锁。但是这个锁有很大一个问题,那就是效率问题,它导致了python仅仅只能利用一个core来进行数据的计算。所以后面为了弥补这个GIL带来的问题,专家们设计了multiprocessing库,gevent库等。前一个是多进程库,为了解决python用于数据密集型处理的情况;后一个用于异步IO处理的情况,基本原理就是在CPU时钟之间来回切换,简单的例子就是爬虫程序爬取网页的时候。假如有10个url,我们都要去GET它,实际上网络之间的延迟是大大高于计算机内部的,那么这个时间内计算机就切换到下一个。

有时候运用多进程是必须的,这个替代不了,哪怕它占用资源很多。

使用

安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install pyinstaller

使用方法(例子):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pyinstaller -D -p F:\Python27\Lib -i logo.ico mian.py

-D:打包成多个文件 -p:指定python安装包路径 -i:指定图标,我的图标放在同目录下 mian.py:要打包的文件,和图标放在同目录下了

-D与-F一一对应,-F是打包成一个单独的文件。最后一排加上–noconsole,就是无窗口运行。

如果py程序是多进程的话,使用pyinstaller打包会出现错误,这个时候只要加上一行代码

在: if name==‘mian’: #新增 multiprocessing.freeze_support()

即可

有的时候你加上图片后打包会出错,这是因为图标里面的格式出错了,需要用图片编辑软件重新对图片内部大小进行设置,这个百度一下吧~

如果要加密混淆代码(其实没有用,一样可以反编译出你的源代码,但是聊胜于无吧)

加上一行 –key=asfweakjhfksafkasdkdbas随便几个字符串

好像要安装依赖包,根据提示安装即可

cx_Freeze

python中比较常用的python转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller。py2exe恐怕是三者里面知名度最高的一个,但是同时相对来说它的打包质量恐怕也是最差的一个。pyinstaller打包很好,但是操作工序较为复杂,推荐cx_freeze,可以通过pip install cx-freeze 安装。–这是别人的描述,其实我觉得pyinstaller其实挺简单的

使用

安装方法:

  1. 打开cmd,输入pip install cx-freeze 后,会发现在python的Scripts文件夹下生成了三个文件
  2. 然后在cmd中,切换到Scripts路径下,输入 python cxfreeze-postinstall,会发现Scripts文件夹下又多了.bat文件,此时已经安装成功
  3. 继续在cmd下尝试输入 cxfeeeze -h 验证下,显示成功。

提示:直接通过 pip install cx-freeze 安装,仍然出现错误时(找不到文件),最好去官网:网址手动下载相应版本的cx-freeze文件,放在Scripts文件夹下,手动双击安装,然后再运行cxfreeze-postinstall。(例如:我的python版本是3.4.3,下载cx_Freeze-4.3.3.win-amd64-py3.4的文件。注意,版本不对无法安装!)

在cxfreeze的安装目录下即\Python34\Scripts,添加一个文件cxfreeze.bat(可用记事本)cxfreeze.bat内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ echo off
C:\Python34\python.exe C:\Python34\Scripts\cxfreeze %*

在该目录下输入czfreeze -h也可以查看安装情况(用pip install cxfreeze就可直接安装改第三方库)

打包方法

打包文件时要在Scripts文件夹路径下操作,文件的路径最好是绝对路径。例如:将 G 盘的 hello.py 打包到 G 盘的 123文件夹下:cxfreeze g:\hello.py –taget-dir g:\123 或者 cxfreeze g:\hello.py –taget-dir g:\123 –base-name=Win32GUI。加上–base-name=Win32GUI可以在运行exe时去掉cmd黑框。

具体操作:

首先在命令提示符中使用cd命令转换到所需要转换的python文件的目录中,因为转换后的dist文件夹会出现在命令提示符的当前目录中

然后输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cxfreeze --init-script=C:\Users\tangc\Desktop\alien_invasion\alien_invasion.py alien_invasion.py

--init-script=后接绝对路径

如果你的程序中有图片等资源,是需要根据程序中的相对路径加入到dist文件中,也要在.exe同目录中加入images的文件夹(图片资源)

如果原.py程序使用了图片等素材,并且添加图片是相对路径(同一个文件夹下可以不使用绝对路径),打包文件后,需要将图片等素材拷贝一份放在打包后的文件夹下,否则运行.exe程序会找不到图片素材。

如果原.py程序使用图片添加的是绝对路径,在本地电脑上运行时可能不会发现错误。但是你将打包后的文件发给另一台机器,运行.exe程序会报错,大概意思是“根据你写的绝对路径找不到图片等素材”,即使你在文件夹下拷贝了素材,但是绝对路径也是错误的,所以,最好使用上一种方法。

注意:

nuitka

Nuitka直接将python编译成C++代码 ,再编译C++代码产生可执行文件,完全不存在反向解析的问题,非常安全,而且由于可执行文件由C++编译而来,运行速度也会获得提升。

但是我在打包中发现了一个文件,那就是在另一台电脑上无法运行…并且实际编译时需要近20分钟,编译的时候cpu持续100%

不过如果只是自己的电脑上运行的话,还是挺好使的

官方文档

注意nuitka对python的某些语法有专门要注意的地方

下载地址

下载完后会提示安装编译c++代码的软件,使用的是gcc

安装好有会有一个MinGW64的文件夹,比如我要打包一个back.py的文件,把这个py文件放在哪个目录下,常用命令如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m nuitka --recurse-all --standalone cc.py

python -m nuitka --standalone back.py

# 可以用的打包方式
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --remove-output --plugin-enable=enum_compat back.py
# 带图标并且有窗口
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --remove-output --icon=logo.ico --plugin-enable=enum_compat back.py
# 不带窗口不带图标
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --remove-output --plugin-enable=enum_compat --windows-disable-console back.py

# 不删除辅助文件夹
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --icon=logo.ico --plugin-enable=enum_compat back.py

# 其他可运行


python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --standalone --remove-output --icon=logo.ico --plugin-enable=enum_compat back.py

在编译的时候大概要挺长时间,并且cpu持续暴涨。

速度…感觉确实变快了点…

代码混淆

你可以自己写混淆器,虽然说是防君子不防小人,但是…罢了不提了…

我使用的是一个在线的代码混淆器,猜测代码会上传到那个服务器上面,所以用或不用看你的需求了

地址

注意:代码规范符合python3

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131354.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
腾讯云服务器搭建 WordPress站点『图文教程』
WordPress 是一款常用的搭建个人博客网站软件,该软件使用 PHP 语言开发。您可通过在腾讯云服务器的简单操作部署 WordPress,发布个人博客。
用户2416682
2019/07/23
8.7K1
玩转CVM之搭建WordPress站点
WordPress 是一款常用的搭建个人博客网站软件,该软件使用 PHP 语言开发。您可通过在腾讯云服务器的简单操作部署 WordPress,发布个人博客。
苏欣
2019/07/26
3.6K0
云服务器搭建网站教程-用腾讯云服务器搭建网站
建网站本身是没有什么难度的,只是配套需要的东西有些繁琐,我们需要提前准备一些软件之类的必备的东西,其中主要包括:
用户6486825
2019/10/17
30.9K0
云服务器搭建网站教程-用腾讯云服务器搭建网站
利用云服务器搭建网站教程
进入到了腾讯云界面,我们输入我们想注册的域名,然后查询,如果我们想要的域名没有被注册的话,我们就可以注册一个,各个后缀价格不同,看自己喜好。域名注册完成之后需要进行实名认证,腾讯云的速度的话我这里是几分钟就实名认证审核通过了,速度还是蛮快的.
Chuanrui 初见之旅
2022/11/14
4.9K0
利用云服务器搭建网站教程
腾讯云服务器+AMH面板+dedecms织梦搭建网站全教程
腾讯云市场中提供了AMH镜像。选择镜像,在腾讯云服务器(CVM)上快速部署具有较高稳定性和安全性的软件环境以及个人网站。
用户2416682
2019/11/27
8.5K1
腾讯云服务器+AMH面板+dedecms织梦搭建网站全教程
使用腾讯云服务器怎么搭建网站?全自动部署建站教程
使用腾讯云服务器怎么搭建网站?全自动部署建站教程,使用腾讯云服务器怎么搭建WordPress网站?太简单了,现在已经不需要手动搭建WP博客了,腾讯云百科以轻量应用服务器为例,腾讯云集成了WordPress应用模板镜像,直接选择这个镜像,腾讯云系统会自动在后台为你的轻量应用服务器安装WordPress程序以及PHP、MySQL等WP依赖的LAMP或LNMP环境,不需要手动部署。
用户9264446
2024/05/25
6490
使用腾讯云服务器怎么搭建网站?全自动部署建站教程
腾讯云轻量应用服务器配置及建网站教程
腾讯云轻量应用服务器如何使用?新手站长以搭建WordPress为例,使用宝塔镜像,先在防火墙开通端口。腾讯云百科来详细说下腾讯云服务器从购买、配置到网站上线全流程,包括轻量服务器配置选择、应用镜像选择、重置密码、防火墙开放端口教程等详细教程:
用户9264446
2022/08/10
9.5K0
腾讯云轻量应用服务器配置及建网站教程
腾讯云服务器搭建网站只需7个步骤(宝塔面板+wordpress)
建网站本身是没有什么难度的,只是配套需要的东西有些繁琐,我们需要提前准备一些软件之类的必备的东西,其中主要包括:
用户2416682
2019/12/07
6.9K0
腾讯云服务器搭建网站只需7个步骤(宝塔面板+wordpress)
【玩转腾讯云】用轻量应用服务器搭建网站
不少小伙伴应该知道,腾讯云正在内测轻量应用服务器,而且马上就要公测了!我提前申请到了一台内测机器,那就来告诉大家,在公测后购买腾讯云轻量应用服务器之后如何玩转它吧,比如搭建静态或者动态网站!
Bess Croft
2020/06/12
11.9K2
【玩转腾讯云】用轻量应用服务器搭建网站
用2核2G的入门级云服务器搭建个人博客网站
国庆假期期间,偶然浏览到了一则云服务器的广告,此后无论是在浏览新闻APP还是购物APP时,都会多次刷到云服务器广告。终于没忍住,买了一台某为的2核/2G/1M的入门级服务器,价格倒是便宜,56块钱一年,可以体验一下,没事的时候也可以用来练习练习Linux命令。
大刚测试开发实战
2022/11/14
4.3K0
用2核2G的入门级云服务器搭建个人博客网站
腾讯云服务器搭建WordPress博客
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。它是使用PHP语言和MySQL数据库开发的。用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。WordPress有许多第三方开发的免费模板,安装方式简单易用。所以,对于初学者来说,我强烈建议使用WordPress来搭建网站。因为这是最简单易用的平台,且使用于任何开发者,用户以及自媒体作家。
用户2416682
2019/10/22
5.1K0
腾讯云服务器搭建WordPress博客
【图文】腾讯云服务器搭建网站教程(宝塔面板+wordpress)
建网站本身是没有什么难度的,只是配套需要的东西有些繁琐,我们需要提前准备一些软件之类的必备的东西,其中主要包括:
2019/07/18
6.4K0
【图文】腾讯云服务器搭建网站教程(宝塔面板+wordpress)
建网站本身是没有什么难度的,只是配套需要的东西有些繁琐,我们需要提前准备一些软件之类的必备的东西,其中主要包括:
云上云
2019/07/02
10.5K2
【图文】腾讯云服务器搭建网站教程(宝塔面板+wordpress)
腾讯云服务器搭建网站
对于服务器来说稳定、极速就选择 2核 4G内存配置的云服务器比较稳妥。这个配置跑网站是比较轻松无压力的。配上 avada主题,可以做出的很大气、高大上的企业网站。下面介绍腾讯云的长期优惠折扣活动,感兴趣的可以注册账号领代金券使用。
用户6577384
2019/10/29
22.7K0
腾讯云服务器搭建网站
【干货】保姆级超细教程从购买服务器到网站搭建成功!
云服务器(Elastic Compute Service, ECS)是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器。
释然IT杂谈
2022/10/27
5K0
【干货】保姆级超细教程从购买服务器到网站搭建成功!
腾讯云服务器(CentOS 7、Tencent Linux)手动搭建LNMP环境(linux+Nginx+Mariadb+PHP)
腾讯云十周年活动刚刚开始时买了的1核2G的星星海云服务器SA2,带宽1M,系统盘50G 高性能云硬盘,288元/3年挺划算。
就要上云
2020/09/12
1.5K0
云服务器如何搭建个人的网站?云服务器搭建网站要多久?
网站是网络的基础,可以说网络就是由一个个网站支撑起来的,不仅企业或公司可以建设网站,就连个人也可以搭建自己的网站,如果想搭建网站,需要借助云服务器的帮助。由于很多人都不知道云服务器如何搭建个人的网站,所以下面将为大家介绍云服务器如何搭建网站的相关内容。
用户8715145
2021/09/03
18K0
基于服务器的个人博客网站搭建
服务器与本地xshell连接,就像连接Linux系统一样,只是ip写成服务器的公网ip。
CoreDao
2021/04/13
4.1K0
基于服务器的个人博客网站搭建
玩转CVM之搭建Discuz! 论坛
Discuz! 是全球成熟度最高、覆盖率最大的论坛网站软件系统之一,被200多万网站用户使用。本教程介绍在 LAMP(Linux + Apache + MariaDB + PHP)环境下搭建 Discuz! 论坛网站的步骤,以 Discuz! X3.2 为例。 具体操作方法如下:
苏欣
2019/07/29
6.7K0
WordPress搭建网站,需要掌握和了解哪些知识点?
对于很多完全没有接触过wordpress和网站搭建的用户来说,还是比较难的,需要学习和了解的知识点还是很多的,但是对于稍微熟悉了的用户来说基本上就是分分钟的事儿,今天就给大家盘点一下有哪些需要了解和掌握的知识点吧。
wordpress建站吧
2022/03/16
2.1K0
WordPress搭建网站,需要掌握和了解哪些知识点?
推荐阅读
相关推荐
腾讯云服务器搭建 WordPress站点『图文教程』
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验