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

Python打包exe文件方法汇总【4种】title:Python打包exe文件方法copyright:truetop:0date:2018-08-1121:08:21tags:打包categories:Python进阶笔记permalink:password:keywords:description:使用py2exe,pyinstaller,cx_Freeze,nuitka对python文件进行打包,…

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


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,内容如下:

#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窗口下运行:

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文件,那么它就会根据代码自动查找需要导入的包。但是隐式导入的话,平常运行是没有问题的,举例:

# 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这个库即可。现在我们导入这个库:

import pymysql

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

  1. 多进程打包的问题

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

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

使用

安装:

pip install pyinstaller

使用方法(例子):

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内容如下:

@ 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文件夹会出现在命令提示符的当前目录中

然后输入:

cxfreeze --init-script=C:\Users\tangc\Desktop\alien_invasion\alien_invasion.py alien_invasion.py

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

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

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

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

注意:

  • 只能指定一个要打包的模块,也就是启动模块

  • 发布后,可执行文件执行路径不能有中文(最好也不要有空格)

  • 启动执行的文件中不要有下面这种判断,否则可执行文件执行会没有任何效果

      if __name__=='__mian__':
    
  • 将exe放到其他机子上运行,弹出“找不到msvcr100.dll“ ,手动将”msvcr100.dll“拷贝到dist目录下即可

  • 要去掉exe里的后面黑色控制台窗口就在前面的命令改成:
    cxfreeze C:\Users\restartRemote.py (需打包文件路径) –target-dir D:\pyproject (存放exe的目标文件夹路径)–base-name=win32gui

nuitka

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

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

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

官方文档

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

下载地址

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

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

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

欢迎关注公众号:【安全研发】获取更多相关工具,课程,资料分享哦~
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 在Android手机上对https请求进行抓包

    在Android手机上对https请求进行抓包前段时间跟QQ群里的群友聊天时无意聊到了抓包的话题。抓包可以说是程序员日常开发调试问题的一个重要手段,可以帮助我们理清客户端与服务器之间的数据传输问题,以便于甩锅。在过去,网络请求基本都是靠的http协议,那个时候的抓包是一件非常简单的事情。然而这几年,http协议在逐渐被淘汰,几乎所有的网络请求都变成了https协议,这就使事情变得复杂了。群里一位朋友说,https是不可能被抓包的,不然怎么保证https传输的安全性,毕竟那么多大公司都在用这个协议来传输重要的数据。这其实是一个比较有意思的话题

  • 详细图解什么叫平方探查法即二次探测再散列和线性探测再散列(数据结构 哈希函数 哈希冲突)

    详细图解什么叫平方探查法即二次探测再散列和线性探测再散列(数据结构 哈希函数 哈希冲突)虽然上文有提到怎么解释的开放地址法处理hash冲突,但是当时只是给了个简单的图,没有详细讲解一下,我当时有点不明白,回头查查资料,然后亲自动手,整理了一下。然后我就三幅图详细讲解一下:什么叫线性探测再散列;什么叫平方探测再散列(二次探测再散列);老师的ppt吧。给个原始数据如上图。下面详细解析。上面的是线性探测再散列。这个简单。

  • notifyAll()_notify for

    notifyAll()_notify for下面这段代码suclassCalculaterextendsThread{ publicinttotal=1; publicvoidrun(){ System.out.println(“Calculatorrun”); synchronized(this){ for(inti=1;i<10;i++){ total*=i; }

  • java对象转换为json字符串_复杂json字符串转对象

    java对象转换为json字符串_复杂json字符串转对象java转换json字符串在学习如何编写基于Java的软件时,开发人员遇到的第一个障碍就是如何将其代码与其他软件连接。这通常是JSON的来源。虽然您可能是Java向导,但JSON是另一种动物。无论如何,这篇博客文章解释了完成工作所需的一切。Java对象是数据和处理可用数据的过程的组合。对象既有状态又有行为。在Java中,使用关键字“new”创建对象。对象是从称为类的模…

  • MATLAB中imfill()函数[通俗易懂]

    MATLAB中imfill()函数[通俗易懂]函数功能:该函数用于填充bai图像区域和“空洞”。语法格式:BW2=imfill(BW)这种du格式将一张二值图像显示在屏zhi幕上,允许用户使用鼠标在图像上点几个点,这几个点围成的区域即要

  • XML简单入门_XML文件都有哪些应用

    XML简单入门_XML文件都有哪些应用XML作用用来保存数据,而且这些数据具有自我描述性它还可以作为项目或模块的配置文件还可以作为网络传输数据的格式(JSON现在为主)语法4. 文档声明5. 元素(标签)6. xml属性7. xmll注释8. 文本区域<?xml version=”1.0″ encoding=”utf-8″ ?><!–文档声明–><books> <book sn = “SN12345648987”> <name>

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号