zoukankan      html  css  js  c++  java
  • PyInstaller 打包 python程序成exe

     pychaim下PyInstaller 打包 python程序

    主题是使用PyInstaller 打包python时遇到一些问题以及解决方案,其中将要打包的程序是用tensorflow做的LSTM算法,这里不会涉及这个算法详解。

    本地环境:window 10 服务器环境 windows2008

    原文地址:原文

    主要运行时版本依赖

    python 3.6  

    PyInstaller  3.4

    tensorflow 1.4   (过程中更新为1.7,原因下详)

    jieba 0.39

    wordcloud 1.5 

    安装与使用PyInstaller  

    在pychaim下可以直接打开下方Teminal 窗口 执行指令  

    pip install PyInstaller

    打包python程序

    PyInstaller -F XXXX.py

    -F 是把所有的相关程序都打包成单个exe运行文件。

    执行过程中会在当前项目根目录下 新建2个文件夹 build ,dist   与一个文件  XXXX.spec

    build文件夹是在打包过程中临时存放所有中间文件的地方

    dist是打包完成后的exe保存位置

    XXXX.spec 与 打包时XXXX.py 是同名文件,自动生成了一份描述性文件,用来告诉pyinstaller 如何打包这个py程序。

    所以一旦自动生成了一个spec文件 后续可以根据需求自行修改 spec文件,然后执行

    PyInstaller -F XXXX.spec

    遇到的问题

    一,AttributeError: module ‘enum’ has no attribute ‘IntFlag

    这个问题有文献1可知,是由于tensorflow 1.4 版本依赖了 enum34 这个库导致的错误,所以我升级为1.7 卸载掉了enum34库

    二,tuple index out of range

    这个异常是由文献2可知,pyinstaller当前版本不支持 python3.6 所以需要从GitHub那边下载develop版本替换掉本地的版本。

    三,No such file or directory: 'c:xxxxjiebadict.txt'

    由于接入了jieba库,因为该库里面用到了一些默认的资源文件如  dict.txt   idx.txt  等,

    这个疑问参考issue 文献3 ,但是解决方案治标不治本,另外还有很多资源文件都无法加载 如:wordcloud 中就加载了默认的 stopword 停用词字典。

    因为在pyinstaller 打包后的exe 运行时会在   C:UsersAdministratorAppDataLocalTemp 新增了一个临时文件夹如“_MEIxxxxxx” 所有py代码都会在临时存放在这里,

    所以很多第三方库中如果使用了 __file__  如下示例:(wordcloud源码)

    FILE = os.path.dirname(__file__)
    
    FONT_PATH = os.environ.get('FONT_PATH', os.path.join(FILE, 'DroidSansMono.ttf'))
    STOPWORDS = set(map(str.strip, open(os.path.join(FILE, 'stopwords')).readlines()))

    jieba库也有类似加载方式。

    会导致运行时__file__ 指向了上面说的临时文件夹“_MEIxxxxxx”,所以就会报错,说找不到该文件,无法打开。

    一劳永逸的办法是修改 spec 文件.

    先把一些需要加载的资源按照第三方库默认的文件结构放在 static(这个名字随你定) 文件夹内 ,如下图

     

    然后根据官方文档参考文献4,修改spec的datas 节点

    datas接收一个元组数组 [(x1,y1),(x2,y2)] 

    x1:是指需要打包的资源文件位置,可以是文件夹名称(我这里是static),单一文件,或者 带有通配符 * 的多个文件。

    y1:是指需要输出到临时文件夹内的相对地址。这里我用了点符号 (.),代表临时文件夹本身。

    这样需要的资源文件就包括进去了,也能正常读取了。

    有其他办法是修改源码的,其实是很不优雅的。

     

    四,No module named 'tensorflow.contrib'

    这个异常在测试环境是没有的,只有打包之后运行才出现,原因是tensorflow.contrib 这个库是懒加载的,所以打包程序没有包括进去,只有在运行时才发现少了。

    这里还是可以通过修改spec文件来隐性导入,就是上图里面的

     hiddenimports=['tensorflow.contrib'],

    结尾:引用请注明出处与作者

    参考文献: 

    1. https://blog.csdn.net/loovelj/article/details/79557456
    2. https://blog.csdn.net/qq_35614920/article/details/77096238
    3. https://github.com/fxsjy/jieba/issues/35
    4. https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation
  • 相关阅读:
    SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSAS 系列
    微软BI 之SSRS 系列
    微软BI 之SSRS 系列
    配置 SQL Server Email 发送以及 Job 的 Notification通知功能
  • 原文地址:https://www.cnblogs.com/7rhythm/p/10196745.html
Copyright © 2011-2022 走看看