• 使用py2exe将python程序打包成exe程序


    近日帮朋友写了个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__,打包以后使用正常。

  • 相关阅读:
    使用ab进行页面的压力测试
    apache http server2.2 + tomcat5.5 性能调优
    php Try Catch多层级异常测试
    用flask实现的添加后保留原url搜索条件
    会议室预定设计
    day4
    day3
    day2
    day1
    redis介绍以及安装
  • 原文地址:https://www.cnblogs.com/simplestupid/p/4716658.html
Copyright © 2020-2023  润新知