上回在《使用 PyInstaller 打包 Python 程序》中,我们介绍了使用 PyInstaller 对 Python 程序进行打包,今天带大家认识一个新的工具:py2exe。

接下来将从这几个方面进行介绍:基本使用方法、高级参数、注意点等。

简介 & 安装

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

  • 安装
pip install py2exe
# 或者
python -m pip install py2exe

基本用法

看一个简单的例子:先写一个简单的脚本,文件名:helloworld.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*- def say_hello(name):
print("Hello, " + name) if __name__ == "__main__":
name = input("What's your name:")
say_hello(name)

下面还需要个用于发布程序的设置脚本:mysetup.py,在其中的 setup 函数前插入语句 import py2exe

from distutils.core import setup
import py2exe setup(console=["helloworld.py"])

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

python mysetup.py py2exe

运行生成的文件:

需要注意,这里需要在 Windows 环境下运行!否则可能会出现以下异常:

上面的命令执行后将产生一个名为 dist 的子目录,其中包含了 helloworld.exe、python24.dll、library.zip 等等文件:

dist 子目录中的文件包含了程序所必须的东西,你需要将该目录中的所有内容一起发布。

默认情况下,py2exe 会在 dist 下创建以下这些文件:

1、一个或多个 exe 文件;

2、几个 .pyd 文件,它们是已编译的扩展名,是 exe 文件所需要的;

3、python**.dll,加上其它的 .dll 文件,这些 .dll 是 .pyd 所需要的;

4、一个 library.zip 文件,它包含了已编译的纯的 python 模块如 .pyc 或 .pyo;

扩展

setup 优化

我们可以看到生成的 dist 目录中文件很多,那么是不是可以进行优化呢?

# mysetup.py
# from distutils.core import setup
# import py2exe # setup(console=["helloworld.py"]) # -*- encoding:utf-8 -*- from distutils.core import setup
import py2exe INCLUDES = [] options = {
"py2exe" :
{
"compressed" : 1, # 压缩
"optimize" : 2,
"bundle_files" : 1, # 所有文件打包成一个 exe 文件
"includes" : INCLUDES,
"dll_excludes" : ["MSVCR100.dll"]
}
} setup(
options=options,
description = "this is a py2exe test",
zipfile=None,
console = [{"script":'helloworld.py'}])

options 可以用来指定一些编译的参数,譬如是否压缩,是否打包为一个文件等。

再次运行后,发现所有内容打包进了一个 helloworld.exe 程序中。

指定额外的文件

一些应用程序在运行时需要额外的文件,诸如配置文件、字体、图标。py2exe 并不会自动把他们打包到 dist 目录,不过可以通过配置参数来打包。

可以在安装脚本中用 data_files 可选项指定了那些额外的文件,那么 py2exe 能将这些文件拷贝到 dist 子目录中。

格式如下:data_files=[("目的文件夹",["文件名",]), ("目的文件夹",["文件名",]), ("目的文件夹",["文件名",]),]。

比如,我们的程序中有一个名为 images 的目录放置了程序需要的图片,

那么我们就需要在 setup 函数中配置参数 data_files,这个参数包含一个元组列表 (target_dir,files),其中 target_dir 是指定文件存放的目标路径,files 是这些额外文件的一个列表。

示例如下:

from distutils.core import setup
import py2exe setup( windows = ['hello.py],
data_files = [('images',['images\*.jpg'])]
)

上面的示例中,会把 images 目录中所有的 jpg 文件打包到 dist/images 子目录中。

注意点

1、py2exe 新版本只支持 python3.3 以上,可以使用 pip install py2exe_py2 来安装兼容 python2 版本;

2、若在 python3.6 版本下运行报错,请切换到 python3.4 尝试;

3、python3 如果是 64 位,生成的 exe 只能在 64 位操作系统下运行,使用 32 位 python 可以解决;

4、从 Python 3.3,Windows 在构建 Python 时使用的是 Visual Studio 2010,因此生成后,需要手动将 msvcr100.dll 拷到生成目录下(dist目录),否则最终的文件运行时可能会报错;

或者通过 data_files=[("",["MSVCR100.dll"])], 打包其中;

比如,我在 Win10 下打的包,拷贝到 Win7 上,运行出错:

出现类似确实 dll 文件的情况,都可以参考这种方法进行解决;

总结

对于 pyinstaller 和 py2exe 两种把 Python 文件打包成 exe 的可执行文件的方法,都有各自的优缺点。但是最终目的都是为了在没有 Python 环境下的普通 Windows 系统的电脑中可直接运行,这点还是很不错的。

大家根据自己的需要,择优选择就行了。

参考:

1、http://irootlee.com/Py2exe/

2、https://www.jianshu.com/p/afc56b647866

使用 py2exe 打包 Python 程序的更多相关文章

  1. Python学习笔记:py2exe打包Python程序

    使用py2exe将一个Python程序打包成一个exe程序,这样Python程序也可以在没有安装Python的环境中运行Python程序了.使用这个工具需要写一个用于打包的setup.py文件(名称可 ...

  2. 通过py2exe打包python程序的过程中,解决的一系列问题

    py2exe的使用方法参考<py2exe使用方法>. 注:程序可以在解释器中正常运行,一切问题都出在打包过程中. 问题1: 现象:RuntimeError: maximum recursi ...

  3. PyInstaller 打包 python程序成exe

    pychaim下PyInstaller 打包 python程序 主题是使用PyInstaller 打包python时遇到一些问题以及解决方案,其中将要打包的程序是用tensorflow做的LSTM算法 ...

  4. “failed to excute script xxx” PyInstaller 打包python程序为exe文件过程错误

    在使用PyInstaller打包python程序,打包命令为: pyinstaller -F -w -i manage.ico yourpyfile.py 顺便说一下几个参数的作用 -F:是直接生成单 ...

  5. 使用py2exe将python程序打包成exe程序

    近日帮朋友写了个python小程序,从互联网上抓取一些需要的文章到本地.为了运行方便,希望能转换成exe程序在windows下定期执行.从百度上找了些文章,发现py2exe的应用比较多,遂使用之. 1 ...

  6. 用Py2exe打包Python脚本简单介绍

    一.简述      Py2exe,从这个名字上就可以理解,把Python脚本转换为windows平台上面可以运行的可执行程序(*.exe)的工具.经过转换后,你可以不 用安装Python的执行环境就可 ...

  7. cxfreeze打包python程序的方法说明(生成安装包,实现桌面快捷方式、删除快捷方式)

    一.cxfreeze基础 1.cxfreeze功能 python代码文件转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller,这三种方式各有千秋,本人只用过py2exe和 ...

  8. py2exe打包python脚本

    在工作中遇到将python脚本转换成exe可执行程序的需求,通过查询可以使用py2exe来构建满足要求的程序,这里简要说明一下使用步骤. 一.py2exe是一个将python脚本转换成windows上 ...

  9. 【Python】 如何用pyinstaller打包python程序成exe

    [pyinstaller] pyinstaller在他们的官方网站上下载:http://www.pyinstaller.org/ 下载完pyinstaller之后还要安装一个支持包pywin32. 这 ...

随机推荐

  1. 在Linux先显示文件

    cat:从第一行开始显示文件内容. tac:从最后一行开始显示内容. nl:显示的时候带行号. more:一页一页显示. less:同more,可以向上翻页. head:显示文件前几行. head - ...

  2. UITableview刷新时界面“乱跑”现象

    Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变 ...

  3. [Android]彻底去除Google AdMob广告

    应用中包含广告是能够理解的,但经常造成用户误点,或者广告切换时造成下载流量,就有点让人不舒服了. 以下就以Google AdMob广告为例,看怎样彻底去除他. 先分析一下Google AdMob的工作 ...

  4. linux c编程:进程控制(一)

    一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同 ...

  5. centos下安装pip时失败:

    [root@wfm ~]# yum -y install pipLoaded plugins: fastestmirror, refresh-packagekit, securityLoading m ...

  6. JPA 多表分页查询

    业务场景:大学生毕业后统计毕业去向.学生实体和毕业去向实体一对一关系. 实体: @Entity @Data @Table(name = "t_s_student") public ...

  7. 路由器桥接(WIFI无线中继)设置及摆放位置图解

    路由器桥接(WIFI无线中继)设置及摆放位置图解 WIFI实在好用,但它的波覆盖面小.穿透力很差.我们安装时要考虑波的衍射特点,装在衍射效果最佳的位置(居中,室外可绕,避开密封墙).确实无法兼顾的地方 ...

  8. linux 基础2-null,cut,wc,head,tail

    一. 特殊文件: /dev/null和/dev/tty Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty.其中/dev/null将会丢掉所有写入它的数据 ...

  9. 数组的includes操作

    数组实例的 includes() Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似.ES2016 引入了该方法. [ ...

  10. ubuntu下使用free命令查看内存实际占用(待补充)

    free不带选项运行会显示一个以kb为单位的默认输出 free -h人类能看懂的方式显示 free -m MB的方式显示 free -g GB方式显示 used=total-free即total=us ...