【pyinstaller】

  pyinstaller在他们的官方网站上下载:http://www.pyinstaller.org/

  下载完pyinstaller之后还要安装一个支持包pywin32. 这个包允许了python访问windows系统的一些API,如果没有就会在编译过程中报错。

  当然,也可以用pip install pyinstaller来一站式下载pyinstaller和它的支持包。

  ■  打包步骤

  用cmd键入python ${pyinstaller根目录}/pyinstaller.py [参数] 入口文件.py即可。入口文件是指当你要打包多个文件为一个exe时的那个程序的入口文件。总之只要你的脚本在IDE或者cmd下是跑得通的那么久可以用pyinstaller来打包成exe。完成后的exe文件在pyinstaller目录中有一个和入口文件名同名的新目录,在这个目录的dist目录里躺着。

  参数可选:

    --console  在打包成exe后双击打开时会带出控制台来显示信息

    --windowed  与console相反,在双击打开exe后没有控制台

    --onefile  默认生成的是一个exe作为入口的一大堆文件,用这个参数把这一对文件さらに打包成一个exe,缺点是这个exe往往有点大。。

    --icon='path'  为生成的exe配一个图标,若不指定则用pyinstaller的默认图标

    等等.......

  *当打开exe秒退,却不知道为什么的时候,可以重新用--console参数再编译一遍,这样就可以看控制台里输出的错误信息了。

  更多参数:(引用自http://www.cnblogs.com/chjbbs/archive/2014/01/25/3533187.html):

  

■  pyinstaller的一些坑

  * 我用pyinstaller的几个项目全都是用wxpython写的GUI界面项目,然而有好几次,打包完之后总是会有各种各样的错误导致exe闪退。看了下报错信息发现错误行全部是在文件最上面的import部分。后来发现错误原因似乎是在import的时候不能用from wx import *这种形式。至于其他模块怎么样不是很清楚が,知道的一点是自己写的那些脚本当做第三方模块使用的时候用这种形式是ok的,而碰到wx的时候一定要老老实实import wx然后用wx.Frame之类的方式。。

  * 有几个程序有登录服务器的界面,我就加了一个同目录下生成配置文件,每次登录界面出现前读取配置文件,来加载上一次成功登录时的账密等信息。但是好几次在IDE里测试的时候OK的,变成exe之后就不行了。后来发现,原来是脚本的属性__file__的锅。在exe中,似乎是不会解释__file__的,所以导致没有办法读取到当前exe的文件路径。

■  部分环境依赖强的程序打包时碰到各种破问题的解决

  将一些工具从字符界面或者GUI的形式转化为WEB表现形式似乎是一种很好的选择。然而WEB编程的时候必然会碰到各种各样的目录/相对路径等等问题。在打包的时候显得特别难受。

  这么说吧,打包成一个exe双击打开之后,其os.path.abspath(__file__)默认是一个建在用户文件夹中的一个临时目录而不是当前程序所在目录或者cmd中所在目录(即使你是在这个目录下运行的程序)。这么一来就使得程序中写相对路径找文件肯定是不行的。可以理解成系统将要执行的exe复制到了一个临时目录,但是又没有复制原来exe所在目录下的其他一些文件,导致找不到文件的错误发生。这样,所有基于__file__的文件补充写法都会变得无效了 。

  另一种补充文件路径的写法是os.getcwd()。这个返回的是工作目录,所以只要在工作目录下打开exe程序(这也是一般双击打开exe程序的一般做法),就可以在相关目录下找到相关的文件。在每一个相对路径前面加上os.getcwd的话虽然比较繁琐但是可以比较稳地指出所有想要使用的文件的绝对路径。

  其实更加方便的一种方法就是在一切代码开始之前就执行以下os.system('cd %s' % os.path.abspath()),把相对目录的路径调整到想要到的工作目录下,这样后面的相对路径写成的文件名就不用改了。

  再补充一下关于flask的,因为上面说的web化GUI或者字符工具我就是用flask做的。flask在寻找templates、static等自带的项目目录下的文件夹时并不是简单地搜寻工作目录,而是有一套自己的方法。在不修改源码的前提下,可以考虑flask.Flask()方法加上参数template_folder和static_folder两个=os.path.join(os.getcwd(),'templates'),os.path.join(os.getcwd(),'static')这样的方法来做。还有一个常用的扩展是flask_bootstrap,继承其模板时也会报错,我没有去看源码看它到底是如何寻找模板文件的,而是直接把base.html复制到本项目目录下然后让本项目的模板文件继承。。

■  字符问题

  除了上面说到的不能import * 以及相对路径起点不能用os.path.dirname(os.path.abspath(__file__))而用os.getcwd()以外,还有一点就是编码的问题。我们脚本中总是习惯性的声明coding:utf-8,这就导致所有的中文字符都是以utf-8形式编码。而包装秤exe之后在dos中运行,通常shell的默认编码是gbk。所以开发时可以保持coding:utf-8,但是用pyinstaller封装前最好改成coding:gbk,以防止控制台乱码的出现。

【Python】 如何用pyinstaller打包python程序成exe的更多相关文章

  1. pyinstaller打包.py程序为.exe操作指南

    pyinstaller打包.py程序为.exe操作指南 20190526内容纲要: 1.pyinstaller安装 2.程序封装 3.可执行程序 0 前言 今天第一次试试将一个py程序封装成一个.ex ...

  2. [python学习笔记] pyinstaller打包pyqt5程序无法运行

    问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...

  3. 【Python开发】PyInstaller打包Python程序

    PyInstaller是一个能将Python程序转换成单个可执行文件的程序, 操作系统支持Windows, Linux, Mac OS X, Solaris和AIX.并且很多包都支持开箱即用,不依赖环 ...

  4. pyinstaller打包py文件成exe文件时,出现ImportError: No module named 'pefile'错误解决办法!

    首先pyinstaller的安装与使用详见如下链接: 安装完成之后,命令行中输入pyinstaller之后,结果如下: ImportError: No module named 'pefile' 缺少 ...

  5. pyinstaller打包django项目成exe以及遇到的一些问题

    1. 环境 环境为:win7 + Python3.6 + Django (2.1.10) + PyInstaller (3.5) 注意: 这里的PyInstaller,笔者是直接使用pip安装,中间会 ...

  6. PyInstaller 打包 python程序成exe

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

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

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

  8. PyInstaller打包python脚本的一些心得

    PyInstaller打包python脚本的一些心得 因为在公司经常要帮同事做一个从excel表格中提取出需要的内容的重复工作,比较繁琐还容易出错:于是就想着要写个程序,但是同事又不可能在电脑上也装上 ...

  9. 使用pyinstaller打包.py程序

    使用pyinstaller打包.py程序 例如打包D:/Desktop 目录下的 filename.py 文件 打开 cmd 将目录切换至 D:/Desktop 输入命令 pyinstaller -F ...

随机推荐

  1. R学习笔记(4): 使用外部数据

    来源于:R学习笔记(4): 使用外部数据 博客:心内求法 鉴于内存的非持久性和容量限制,一个有效的数据处理工具必须能够使用外部数据:能够从外部获取大量的数据,也能够将处理结果保存.R中提供了一系列的函 ...

  2. Java中的大小写字母相互转换(不利用Java自带的方法)

    Java中的大小写字母相互转换(不利用Java自带的方法) 1.设计源码 /** * * @title:UpperAndLower.java * @Package:com.you.utils * @D ...

  3. DirectX--yuv420p上实现的字符叠加

    unsigned char *pTemp; BYTE OsdY = 0;BYTE OsdU = 0;BYTE OsdV = 0; void OSDSetTextColor(BYTE OsdR, BYT ...

  4. python实现简单排序算法

    算法 递归两个特点: 调用自身 有穷调用 计算规模越来越小,直至最后结束 用装饰器修饰一个递归函数时会出现问题,这个问题产生的原因是递归的函数也不停的使用装饰器.解决方法是,只让装饰器调用一次即可,那 ...

  5. 如何在Java应用中提交Spark任务?

    最近看到有几个Github友关注了Streaming的监控工程--Teddy,所以思来想去还是优化下代码,不能让别人看笑话,是不.于是就想改在一下之前最丑陋的一个地方--任务提交 本博客内容基于Spa ...

  6. Java汉字乱码问题

    window->preferences->输入框输入"encod" 将text file encoding 从default改成other utf-8 同理,css,H ...

  7. jsp学习笔记之:内置对象

    application对象: 设置一个名为name,值为val的应用内共享的数据 <% application.setAttribute("name",val); %> ...

  8. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

    [BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...

  9. 【CJOJ P2226】[省常中2011S4] 圣诞节

    Description 圣诞节到了,FireDancer准备做一棵大圣诞树.下图为圣诞树的一个简单结构. 这棵树被表示成一组被编号的结点和一些边的集合.结点从1到n编号.树的根永远是1.每个结点都有一 ...

  10. 1.1 java语言有什么优点

    1.java是一种纯面向对象的语言.(更易理解和学习) 2.平台无关性.(java是一种解释性的语言,编译器会把java语言变成中间代码,然后在JVM上运行,可移植性) 3.java提供了很多内置的库 ...