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

1. 下载py2exe

官网:http://www.py2exe.org/index.cgi/FrontPage

我使用的是py2exe-0.6.9.win32-py2.7.exe

直接安装即可。

安装完成以后,python的Lib/site-packages目录下会多出py2exe目录和egg-info文件。

2. 编写setup.py

py2exe的用法非常简单,写好setup.py文件以后,执行python setup.py py2exe即可。

最简单的示例可以参考官网Tutorial的示例:http://www.py2exe.org/index.cgi/Tutorial

此处我的setup.py文件如下:

# coding=utf8

from distutils.core import setup
import py2exe extra_modules = ["bs4"] options = {"py2exe":
{"compressed": 1,
"optimize": 2,
"bundle_files": 1, # 表示把所有文件打包进exe可执行程序
"packages": extra_modules,
#"includes": extra_modules
}
}
setup(
version = "1.0.0",
description = "test for py2exe",
name = "Py2exeTest",
options = options,
zipfile = None,
console = [{"script": "app_main.py"}]
)

其中几个重要的参数:

console = [{"script": "app_main.py"}] 表示这是个控制台程序,希望把app_main.py打包成exe程序。我的工程中有多个py源文件,此处只需要指定入口py文件即可,py2exe会把其它py文件自动导入。

zipfile = None 默认py2exe会生成一个library.zip的库文件;此处为None,则不生成改文件,把它打包到exe文件。

"packages": extra_modules 指定依赖的其它模块。我用到的beautifulsoup,所以这里指定bs4。这里我用"includes": extra_modules也没问题,没有细究二者的区别。

"bundle_files": 1 表示要把所有文件打包成一个 exe可执行程序

3. 生成exe文件

在setup.py目录,执行python setup.py py2exe命令即可。

执行成功会在同目录下生成build和dist两个目录。build是py2exe执行的中间过程,可以删掉。dist是生成的exe文件,如下:

其中app_main.exe是我的程序,执行即可。w9xpopen.exe是py2exe自动生成。

4. 问题

(1)ImportError: No module named bs4

打包过程中碰到一个问题"ImportError: No module named bs4",后来上网一查发现问题比较普遍。但解决过程还是小有波折,因此记录一下。

现象:打包成exe过程顺利,但是执行过程中出现ImportError问题,bs4模块找不到。

上网找解决方案,有一篇文章说是需要在app_main.py中显示指定import bs4,否则py2exe会被"欺骗",误以为用不到bs4模块,不会打包。尝试了该方法,问题依旧,没有解决。

之后再找,说是需要在setup.py中指定这种额外的依赖模块,"includes":["bs4"]。遂修改setup.py,不仅用了includes参数,还用了packages参数。出现新的问题,打包过程中就出现"ImportError: No module named bs4"问题。问题仍无法解决。

后来再找,看到一网友的回帖,感觉可能是beautifulsoup的安装py2exe不识别。我发现python的Lib/site-packages下安装的是egg文件,beautifulsoup4-4.4.0-py2.7.egg。用winrar将其解压,把bs4目录直接放到Lib/site-packages下,再打包并执行,一切正常。问题解决。

可见,py2exe无法识别egg文件,需要解压使用

(2)NameError: name '__file__' is not defined

工程中使用了os.path.dirname(os.path.realpath(__file__))来找到py文件所在目录的绝对路径。但是打包成exe以后执行,出现“NameError: name '__file__' is not defined”的问题。上网查找,stackoverflow中有人提到:“Scripts running under py2exe do not have a __file__ global. Detect this and use sys.argv[0]instead”。因此使用os.path.dirname(os.path.abspath(sys.argv[0]))替代__file__,打包以后使用正常。

使用py2exe将python程序打包成exe程序的更多相关文章

  1. python + pyinstaller 实现将python程序打包成exe文件直接运行

    pyinstaller 我们在平常学习使用python的时候经常会自己编写一些小程序来使用,虽然python是跨平台的语言,但是如果我们想要在一个没有python以及很多库环境的电脑上使用我们的小程序 ...

  2. python爬虫程序打包为exe程序并在控制台下运行

    上一篇文章实现了爬取任意两个用户共同想读的图书的python程序.现在此程序打包为exe程序. 使用pyinstaller实现此功能.在pyinstaller官网下载http://www.pyinst ...

  3. 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片)

    解决 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片) 1.当我们写了一个Python的项目时,特别是一个GUI项目,我们特备希望它能成为一个在Windows系统可执行的EXE文件 ...

  4. 把Python项目打包成exe文件

    我们很多时候,写好的程序需要打包成.exe文件才可以发给客户,那么今天我就来谈一谈,如何将一个写好的Python程序打包成exe文件! 首先,我们我们使用到的工具是python 3.7 和 Pyins ...

  5. 关于python文件打包成exe的调试问题

    python文件使用pyinstaller打包的问题 常用pyinstaller相关命令 文件整体打包, 会自动打包相关依赖 pyinstaller -F file 分文件打包,只打包单个文件,其他文 ...

  6. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  7. Java桌面程序打包成exe可执行文件

    前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...

  8. JAVA程序打包成exe文件详细图解

    我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: eclipse ...

  9. Java程序打包成exe可执行文件

    前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...

随机推荐

  1. stylish——一键为网页换肤,改变字体大小,去除广告

    今天给大家介绍的是一款非常好用的插件stylishstylish是一款可以为网站自定义主题的插件 可以在chrome的应用商店找到也可以通过网址访问https://userstyles.org/ 应用 ...

  2. Vue.js基础2

    声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM: <div id="app"> {{ message }} </div ...

  3. hdu 1010 Tempter of the Bone(dfs)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  4. ORM(Object Relational Mapping)框架

    ORM(Object Relational Mapping)框架 ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放 ...

  5. Android常用的图片加载库

     Android常用的图片加载库 前言:图片加载涉及到图片的缓存.图片的处理.图片的显示等.四种常用的图片加载框架,分别是Fresco.ImageLoader. Picasso. Glide. Uni ...

  6. 【转】ubunt 安装 yum出现 ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法

    今天本来是用xshell 链接本地的linux的,然而链接的时候没有主动弹出输入 用户名和密码的对话框,google搜了下,遇到了上面的问题. 解决办法如下:1.终端输入 ps  aux ,列出进程. ...

  7. salt 之 master and minion

    系统:centos7.2 master:192.168.1.41minion:192.168.1.46 注释: setenforce 0 --关闭selinux systemctl stop fire ...

  8. 针对XX系统的可用性方面的相关想法(结合书)

    在开始对此系统进行再次分析之前,再回顾下可用性.首先,可用性是与系统故障有关的一个质量属性,是指系统正常运行的时间的比例,一般通过两次故障之间的时间长度或在系统崩溃情况下能恢复正常运行的速度来衡量,同 ...

  9. Android中如何在Eclipse中关联源代码?(图文)

    关联源代码 1.删除工程里面的Android Depandencies,删除后会报错,不要理会.看下面 2.添加libs目录下的Android-support-v4.jar包 选中-->右键-- ...

  10. 修改mysql允许主机访问的权限

    开启mysql的远程访问权限 默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限. 主流的有两种方法,改表法和授权法. 相对而言, ...