安装了python 3.6.6版本,Anacondas是最新版本,用pyinstaller打包时,问题不断,不是递归,就是这样那样的问题。
后看到有朋友说,pyinstaller对3.6以上版本支持不好。
起因,递归:
关于递归循环:
原来在python 3.6.6版本里,用pyinstaller 打包,一直提示递归问题,将递归深度,改为5000~10000,都不行。
于是测试时哪里问题。当只输入引入模块,选择import openpyxl,就提示了递归问题。
# -*- coding:utf8 -*-
import tkinter as tk
#import pandas as pd
import openpyxl as op
import os
import tkinter.messagebox #用message必须用这个引入
import sys
#sys.setrecursionlimit(5000)
print ("你好")
root=tk.Tk()
root.title("EXCEL助手 Ver1.0 by hongchang")
root.geometry('400x260')
root.mainloop()
说明不是代码问题,应该是版本兼容等原因。
于是,做法如下:
1)干脆卸载了Anacondas,安装了Anacondas3 4.2.0版本(https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/)),其支持的python 为 3.5.2
2)因原先单独安装过python 3.6.6,而其没有卸载命令,如是重新下载同版本的PYTHON((https://www.python.org/downloads/release/python-366/)
),选自定义安装,安装目录选在原来安装的python目录里。 获得原来python 安装目录的路径,在CMD里输入:
where python
安装python,因版本相同,出现三个选项,最后一个问,是否卸载,点卸载即可。
假如卸载没出现,也可先安装一遍。
然后再安装一遍,提示是否卸载,卸载即可。
卸载完,把没有卸载的残余目录里的文件删掉即可。
在CMD ,输入:
python -V
显示的是 python 3.5.2版本。
3)安装pyinstaller,安装了几个版本都不行,直接用开发版pyinstaller。
开发版pyinstaller下载地址:https://github.com/pyinstaller/pyinstaller
下载解压后,通过cmd终端进入此文件夹内执行:
比如我的pyinstaller,将他放到python所在的SCRIPT目录里。
C:\Program Files\Anaconda3\Scripts
打开cmd(Ctrl + R),用cd命令进入到这个目录:
c:>cd C:\Program Files\Anaconda3\pyinstaller-develop\pyinstaller-develop
(注意,入股是不同盘符,比如d:\aa,在CMD切换目录时,不用cd,直接输入目录即可
c:>d:\aa)
切换后,安装install:
python setup.py install
(或 pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip)
安装,提示超时:
网络服务器问题,换下命令
python setup.py install --default-timeout=100
pyinstaller --version 查看安装结果
然后终端执行(这是我是在pyinstall文件路径下执行的):
接着把你要转换的.py文件放入该目录下,用excelcs13.py展示!
python pyinstaller.py -F F:\python_code_test\excelcs13.py
常用的命令中间的参数说明:
-w指令:直接发布的exe应用带命令行调试窗口,在指令内加入-w命令可以屏蔽。
-F指令:注意指令区分大小写。这里是大写。使用-F指令可以把应用打包成一个独立的exe文件,否则是一个带各种dll和依赖文件的文件夹
生成文件的保存路径在终端可见,自己注意。
结果提示:
TypeError: from_buffer() cannot return the address of the raw string within a bytes or unicode object
网上看了一下,一般setuptools运行完就可以打包程序了,可能这是python3.5的bug?通过大神一顿操作分析,我得知问题在于日志信息中的cffi报错,于是安装了cffi
pip install --upgrade cffi
成功
4)打包EXE后,运行一闪而过!
虽然可以打包了,但是一闪而过,都看不清命令窗口的提示。
解决方法:
打开CMD,将生成的EXE文件拖入到CMD窗口,就看到了提示信息。
提示,某些模块没有安装,按照提示,安装相应模块。
特别说明:安装PYTHON版本时,安装32位的,不要安装64位的,因用PYINSTALLER大宝,64位电脑生成的,32位电脑运行不了。而32位生成的,64位电脑可以运行!
解决方法:
使用32位的python环境,再重新打包一次。
anaconda是,能够区分python版本,也能够构建32及64位的虚拟环境,就去官网下了一个64位的python3.7版本anaconda
关于安装文档,网上很多,由于在安装anaconda 之前,我电脑上已经有python了,就需要关联起来:
1、直接把已有的python版本安装文件夹复制到anaconda安装文件夹的envs文件夹内,
2、实现关联,在命令行(cmd)运行
conda create -p <envs下的python文件名完整路径>
,就可以实现关联。
3、切换不同版本,如将python环境切换到32位
4、安装相应的模块和打包工具
如
安装你需要的模块,比如pandas模块,
用
pip install pyinstaller
```安装打包工具。
最后
```pyinstaller -F -w luobotou.py
得到的dist 文件夹内的可执行文件在32位系统下成功打开,
而且32位系统下能够打开的同时,在64位系统下运行也是没有问题的。