-
2021-09-23 22:53:25
使用工具:Pyinstaller
1 准备信息
本python项目文件中有:
多个.py文件
文本文件夹:data,含一个.pkl和xml文件
venv:环境所需的包,如imutils、numpy、pyqt5等
项目文件路径为 C:\Users\ray\Desktop\auto_rec_new(供下面参考使用)
2 生成.spec文件
按Shift同时右键整个项目所在文件夹,点击"在此处打开powerShell窗口",并输入
pyi-makespec -w xxx.py
xxx为项目启动文件的名称
3 配置spec文件
2步执行后文件夹中会生成三个文件:xxx.spec、dist、build,打开xxx.spec
1 添加当前路径:
如下图第五行文字所示,设置项目文件夹的路径
SETUP_DIR = 'C:\\Users\\ray\\Desktop\\auto_rec_new\\'
2 添加相关.py文件
将项目相关的.py文件路径添加到Analysis中,最好都放在SETUP_DIR这个路径下,这样的话就只用写文件名就行了;如果文件在子目录中,需写成相对路径或绝对路径(绝对路径亲测没问题,相对路径没试过)
3 设置当前路径
在pathex后添加当前路径,也就是SETUP_DIR去掉后面两个”\\”
4 配置文本文件
文本文件已知包括的有.pkl和.xml文件,欢迎读者在评论区扩充!
在项目路径下创建文件夹data,并把文本文件都放进去(此处记得要将代码中调用这些文本文件的路径也一并改了)
随后在.spec的datas行写:
datas=[(SETUP_DIR+'data','data')],
4 打包文件
同2步一样,打开shell命令窗口
输入(xxx.py仍为项目启动文件):
pyinstaller -F -w xxx.py
5 运行程序
运行successfully后可在dist目录下找到.exe文件,直接执行即可
6 常见报错
1 缺少qtwebengine_locale
报错为Unable to find \PyQt5\Qt\translations\qtwebengine_locale
在cmd中输入:
pip install PyQtWebEngine
2 递归次数过多
报错为RecursionError: maximum recursion depth exceeded while calling a Python object
在.spec最上面添加下述代码(括号中数字可以按需修改),可以参考上面的.spec文件截图:
import sys sys.setrecursionlimit(10000)
更多相关内容 -
如何将python文件打包成exe文件
2019-08-10 10:51:32主要介绍如何利用pyinstaller将python文件打包成exe文件。 -
python文件打包成exe
2022-04-15 16:38:16python文件打包成exe可执行文件: 以game2048.py脚本为例,实现打包生成可执行文件。 非计算机软件专业的我从大学开始学习计算机语言后,只知道如何写代码,运行调试,功能实现,总感觉差丢丢儿。后来因为兴趣和工作...python文件打包成exe可执行文件:
以game2048.py脚本为例,实现打包生成可执行文件。
本文介绍将python文件打包成exe可执行文件的方法。
关键库:
提示:pyinstaller安装,使用实践。
1、 安装pyinstaller
anaconda大环境下安装运行:conda install pyinstaller
没有conda就在命令行中运行:pip install pyinstaller
2、 打包python文件实例
将编写的2048游戏程序脚本保存在game2048.py中;
把它打包成exe需要在同一文件夹中打开命令行并输入:
pyinstaller -F ./game2048.py
回车后运行,如果一切顺利,文件夹中会多出一个后缀为spec的文件,以及两个名为dist和build的文件夹。
打开dist,可以找到game2048.exe,这就是生成的可执行文件。3、pyinstaller的其他的选项,参数:
-i: 后接图标文件名,表示用自定义图标生成exe程序
-w: 生成的exe程序不带窗口执行
如果想只运行tkinter 页面,去掉dos窗口需要在打包的时候 加上 -w 参数eg. pyinstaller -F calc.py -w
注意:
- pyinstaller需安装在脚本所依赖环境env里,或者打包时保证你的脚本运行和所依赖的env一致。比如,用命令行打包有默认python环境,而调试代码用的是另一个环境。
- 生成的exe文件可复制到电脑上的任何地方单独使用。
实践:
游戏脚本
game2048.py
注意:游戏界面引入了curses库
,Windows下使用该库的注意事项和安装。# !/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/8/6 15:15 # @Author : Haiyan T # @Email : 893190391@qq.com # @File : game2048.py # Begin to show your code! import curses # 绘制在下的用户界面和漂亮的图形 from random import randrange, choice from collections import defaultdict letter_codes = [ord(ch) for ch in 'WASDRQwasdrq'] # 上左下右,ord函数是把字符转换成对应的数字 actions = ['Up', 'Left', 'Down', 'Right', 'Restart', 'Exit'] # 上,左,下,右,重启,退出 actions_dict = dict(zip(letter_codes, actions * 2)) # 把字母与动作对应起来。 zip是把元组中的值对应起来。 # print(actions_dict) def get_user_action(keyboard): char = "N" # char的初始值为N while char not in actions_dict: char = keyboard.getch() return actions_dict[char] # 阻塞+循环,直到获得用户有效输入才返回对应行为 # 行列转置 def transpose(field): return [list(row) for row in zip(*field)] # zip函数里边加*号,是把行变列,列变行。 # 列表前后颠倒 def invert(field): return [row[::-1] for row in field] # 创建棋盘 class GameField(object): def __init__(self, height=4, width=4, win=2048): self.height = height # 高 self.width = width # 宽 self.win_value = win # 过关分数 self.score = 0 # 当前分数 self.highscore = 0 # 最高分 self.reset() # 重置棋盘 def reset(self): # 定义一个reset函数 if self.score > self.highscore: # 如果当前分数大于最高分,那么把当前分数赋值给最高分 self.highscore = self.score self.score = 0 # 当前分数恢复到0分 self.field = [[0 for i in range(self.width)] for j in range(self.height)] # 横纵坐标恢复到(0,0) self.spawn() # 调用spawn这个函数 self.spawn() def move(self, direction): # 定义move函数 def move_row_left(row): # 向左移 def tighten(row): # squeese non-zero elements together 把零散的非零单元挤到一块 new_row = [i for i in row if i != 0] # 如果i不等于零,把他们赋值到new_row这个元组中 new_row += [0 for i in range(len(row) - len(new_row))] # 其余位置用0补充 return new_row # 返回这个元组 def merge(row): # 定义merge函数,用来合并单元 pair = False # pair初始值为假 new_row = [] # new_row初始值为空 for i in range(len(row)): # 让i在格子里循环 if pair: # 如果pair为真 new_row.append(2 * row[i]) # 那么把把row【i】的值乘以2,追加到new_row后边 self.score += 2 * row[i] # 并且得分为row【i】的值乘以2 pair = False # pair重新赋值为假 else: # 如果pair为真 if i + 1 < len(row) and row[i] == row[i + 1]: # 如果i+1还没到边界,并且此时的row【i】=row【i+1】 pair = True # 那么pair为真 new_row.append(0) # new_row后追加零 else: new_row.append(row[i]) # 否则追加row【i】 assert len(new_row) == len(row) # 提醒两者长度一致 return new_row return tighten(merge(tighten(row))) # 反复合并,知道不能合并为止 moves = {} moves['Left'] = lambda field: \ [move_row_left(row) for row in field] # 做移动 moves['Right'] = lambda field: \ invert(moves['Left'](invert(field))) # invert是逆转 moves['Up'] = lambda field: \ transpose(moves['Left'](transpose(field))) # transpose是转置 moves['Down'] = lambda field: \ transpose(moves['Right'](transpose(field))) if direction in moves: if self.move_is_possible(direction): # 如果移动方向在四个方向上, self.field = moves[direction](self.field) # 那么调用moves函数 self.spawn() # 产生随机数 return True else: return False def is_win(self): return any(any(i >= self.win_value for i in row) for row in self.field) def is_gameover(self): return not any(self.move_is_possible(move) for move in actions) def draw(self, screen): help_string1 = '(W)Up (S)Down (A)Left (D)Right' help_string2 = ' (R)Restart (Q)Exit' gameover_string = ' GAME OVER' win_string = ' YOU WIN!' def cast(string): screen.addstr(string + '\n') def draw_hor_separator(): line = '+' + ('+------' * self.width + '+')[1:] separator = defaultdict(lambda: line) if not hasattr(draw_hor_separator, "counter"): draw_hor_separator.counter = 0 cast(separator[draw_hor_separator.counter]) draw_hor_separator.counter += 1 def draw_row(row): cast(''.join('|{: ^5} '.format(num) if num > 0 else '| ' for num in row) + '|') screen.clear() cast('SCORE: ' + str(self.score)) if 0 != self.highscore: cast('HGHSCORE: ' + str(self.highscore)) for row in self.field: draw_hor_separator() draw_row(row) draw_hor_separator() if self.is_win(): cast(win_string) else: if self.is_gameover(): cast(gameover_string) else: cast(help_string1) cast(help_string2) def spawn(self): new_element = 4 if randrange(100) > 89 else 2 (i, j) = choice([(i, j) for i in range(self.width) for j in range(self.height) if self.field[i][j] == 0]) self.field[i][j] = new_element def move_is_possible(self, direction): def row_is_left_movable(row): def change(i): # true if there'll be change in i-th tile if row[i] == 0 and row[i + 1] != 0: # Move return True if row[i] != 0 and row[i + 1] == row[i]: # Merge return True return False return any(change(i) for i in range(len(row) - 1)) check = {} check['Left'] = lambda field: \ any(row_is_left_movable(row) for row in field) check['Right'] = lambda field: \ check['Left'](invert(field)) check['Up'] = lambda field: \ check['Left'](transpose(field)) check['Down'] = lambda field: \ check['Right'](transpose(field)) if direction in check: return check[direction](self.field) else: return False def main(stdscr): def init(): # 重置游戏棋盘 game_field.reset() return 'Game' def not_game(state): # 画出 GameOver 或者 Win 的界面 game_field.draw(stdscr) # 读取用户输入得到action,判断是重启游戏还是结束游戏 action = get_user_action(stdscr) responses = defaultdict(lambda: state) # 默认是当前状态,没有行为就会一直在当前界面循环 responses['Restart'], responses['Exit'] = 'Init', 'Exit' # 对应不同的行为转换到不同的状态 return responses[action] def game(): # 画出当前棋盘状态 game_field.draw(stdscr) # 读取用户输入得到action action = get_user_action(stdscr) if action == 'Restart': return 'Init' if action == 'Exit': return 'Exit' if game_field.move(action): # move successful if game_field.is_win(): return 'Win' if game_field.is_gameover(): return 'Gameover' return 'Game' state_actions = { 'Init': init, 'Win': lambda: not_game('Win'), 'Gameover': lambda: not_game('Gameover'), 'Game': game } curses.use_default_colors() game_field = GameField(win=2048) state = 'Init' # 状态机开始循环 while state != 'Exit': state = state_actions[state]() curses.wrapper(main) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
anaconda prompt下运行打包:
(DeepLearningSlideCaptcha) C:\Users\Administrator>pyinstaller -F E:\structure_learning\0304t\2048\game2048.py
- (DeepLearningSlideCaptcha) 环境,可使用
activate
切换。 - pyinstaller -F E:\structure_learning\0304t\2048\game2048.py 命令。
- 结果
...... 7280 INFO: checking EXE 7281 INFO: Building EXE because EXE-00.toc is non existent 7281 INFO: Building EXE from EXE-00.toc 7281 INFO: Appending archive to EXE C:\Users\Administrator\dist\game2048.exe 7286 INFO: Building EXE from EXE-00.toc completed successfully. 123456
测试:
- 直接打包
生成的exe程序如下:
双击运行
\2. 带图标打包
pyinstaller -F -i 图标地址 脚本地址
回车,打包完成pyinstaller -F -i E:\TanhaiyanLearn\structure_learning\0304t\2048\2048.ico E:\TanhaiyanLearn\structure_learning\0304t\2048\game2048.pyE:\TanhaiyanLearn\structure_learning\0304t\2048\2048.ico E:\TanhaiyanLearn\structure_learning\0304t\2048\game2048.py 1
-
python脚本打包可执行文件exe
2018-12-04 11:31:10将自己写的python文件压缩成exe有两种方法: 1、使用pyinstaller 将自己写的python文件压缩成exe有两种方法: 1、使用pyinstaller step2:cd 到你的文件目录cd D:\py\python testcases\Slice step4:看结果... -
怎么将多个python打包成exe文件
2020-11-20 21:50:59展开全部1、安装pywin32,可以bai参考...3、准备一个py文件,一个爬取电子书的python文件——00.py。4、准备一个图片,作为exe的图标:b.ico,注意图片格式是ico的,大小为32*32,不要太大。没有的话,可以在网...展开全部
1、安装pywin32,可以bai参考《怎么给dupython安装pywin32模块zhi?》,一定要注意dao对应的python版本,否则不能安版装。
2、用命令权行调用pip安装pyinstaller。
3、准备一个py文件,一个爬取电子书的python文件——00.py。
4、准备一个图片,作为exe的图标:b.ico,注意图片格式是ico的,大小为32*32,不要太大。没有的话,可以在网上免费转格式。把00.py和b.ico放到一个目录里面——C:\a
5、把cmd的当前目录切换到C:\a。
6、然后执行命令行: pyinstaller -F -i b.ico 00.py
7、运行之后,cmd变成了这样。
8、在C:\a目录里面,多出了几个文件夹。可执行文件00.exe就在dist文件夹里面。
9、双击可执行文件,会弹出一个命令提示符端口,提示你输入书号。按照格式输入书号,点击回车键,就可以在dist文件夹里面,看到一章章的电子书被下载下来了。
-
三步教你如何将python文件打包成exe可执行文件
2020-04-12 22:20:17python 打包成exe 主要有两种,一种是py2exe,另一种便是pyInstaller,之前我是用py2exe的,但是我后来发现py2exe存在问题:1,打包好的 exe只能在相同的系统下运行,比如你在XP系统用py2exe打包好的exe只能在XP上...python 打包成exe 主要有两种,一种是py2exe,另一种便是pyInstaller,之前我是用py2exe的,但是我后来发现py2exe存在问题:1,打包好的 exe只能在相同的系统下运行,比如你在XP系统用py2exe打包好的exe只能在XP上运行,在win7上肯定有问题,而且也是存在在别的XP机子上也可能不能运行,因为一些别的机子可能会缺少dll文件什么的,作者我当时之所以抛弃py2exe 也是因为这个原因;2,打包的文件也需要打包同exe下的dll,和一些库的压缩包,不然exe根本跑不起来。
所以作者强烈建议大家在python打包的话使用pyInstaller,在这我主要同大家分享pyInstaller的打包方法.1. 安装pyinstaller
执行:pip install pyinstaller
2.准备python代码:hello.py
Input = input(“你想说什么:”)
print(“你说的是:”+Input)3.打包
在命令控制台,切换到hello.py的路径下,执行:pyinstaller -F hello.py
效果图:
《打完收工》
哈哈,再稍作解释:1.
命令执行后,会在当前目录下产生两个文件:一个是build,一个是dist。分别放的是文件执行的依赖包和执行文件。exe文件就在dist文件夹下。
2.
-F是pyinstaller的选项命令。如果加F,效果图如下:
不加F,效果图如下:
pyinstaller.exe后面如果加上-F就是打包为一个exe文件(文件会比较大),如果不加就会有很多库文件。3.其他命令
-
Python3打包exe文件(解决运行时出现黑窗口)
2020-12-21 18:12:31Python3打包成exe文件(解决运行时出现黑窗口问题\color{red}{解决运行时出现黑窗口问题}解决运行时出现黑窗口问题) 安装pyinstaller pip install pyinstaller 打包教程 首先,切换到要打包程序的目录,比如我要... -
Python文件如何打包成exe文件
2020-11-23 06:04:02Python文件打包成exe文件的方法:方法一、使用py2exe打包exe文件py2exe是一种将Python脚本转换为Windows .exe应用程序的简单方法。它是一个基于Distutils的实用程序,允许我们在Windows计算机上运行用Py... -
Python打包成exe文件_详细操作
2022-03-31 02:47:32对于python为什么要打包成exe文件,是因为传输源文件以及源代码给他人是需要配置好一定的环境才能进行编译操作,而打包成exe文件就可以跟电脑软件一样打开就可以运行也可以分享给他人。但是打包好的exe文件并不是很... -
Python如何将py文件打包成exe
2020-11-21 02:53:09生成exe文件一、单个py文件在py文件目录下,打开cmd窗口,输入pyinstall -F XXX.py,执行成功的话,会在当前目录生成一个dist文件夹,XXX.exe文件在此文件夹下。如果是图形窗口,不想要控制台出现的话,可以... -
Yhen手把手教你把python文件打包成exe可执行程序
2020-04-16 23:47:14所以今天给大家分享一个比较实用的小经验 把python文件打包成exe可执行程序 其实我之前在 【爬虫】Yhen手把手带你爬取去哪儿网热门旅游信息(并打包成旅游信息查询小工具) 这篇文章里也介绍过打包exe的方法 今天我... -
将python文件打包成exe可运行文件
2020-12-04 10:35:49还缺少两个常用的切换(自动切换与透明度渐变),当然 ... JavaWeb学习笔记三 Servlet Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质... -
python将项目打包成exe文件
2022-03-09 15:24:36如果就是简单一个py文件,在项目根目录下直接用命令pyinstaller -D filename.py即可,打包后会在当前目录下生成两个文件夹build是存放编译时的临时文件,dist存放打包好的exe文件; 如果项目存在多个目录,涉及多个... -
Python的多个py文件打包成exe
2019-09-20 13:28:11Python的多个py文件打包成exe 安装pyinstaller 打开命令行 输入pip install pyinstaller 如遇报错,输入网址https://www.lfd.uci.edu/~gohlke/pythonlibs/ 全局搜索pyinstaller.whl文件,然后下载 输入pip install ... -
如何将Python脚本打包成exe执行文件
2021-05-15 10:38:15Python脚本打包成exe执行文件需求代码实现打包exe执行文件安装pyinstaller打包直接执行脚本执行效果 需求 一个教辅目录结构检查工具,目录结构是[书籍]-[章节]-[题目|答案]-[*.jpg],后台有个异步处理的服务,需要强... -
windows下使用pyinstaller将多个目录的Python文件打包成exe可执行文件
2020-04-06 11:32:01需要将一个工程涉及两个目录的模块文件打包成exe,打包环境如下: 1、windows7; 2、Python 3.7.2; 3、PyInstaller 3.6 。 二、操作步骤 2.1、使用清华镜像下载并安装pyinstaller, pip install ... -
Python打包可执行文件的方法详解
2020-12-25 01:14:08Python程序需要依赖本机安装的Python库,若想在没有安装Python的机器上运行,则需要打包分发,目前有两个比较好用的工具:PyInstaller和py2exe。其中py2exe应用在windows下,而PyInstall则可应用windows、Linux以及... -
将python文件打包成exe可执行文件过程中遇到的问题及解决办法
2019-10-08 16:48:06我安装的python3.6 64+win10+JetBrains PyCharm 2018.1.3 x64 二、安装包 pywin32 下载地址:https://github.com/mhammond/pywin32 PyInstaller 下载地址:http://www.pyinstaller.org/downloads.html 一开始我在... -
一次python打包成exe最完美的解决方法(windows)
2020-11-25 21:07:25使用工具virtualenv在...如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python 3。如果应用A需要jinja 2.7,而应用B需要jinja 2.6怎么办?这种情况下,每个应用可能需要各自... -
将python打包成exe文件(携带附属文件)
2022-04-21 19:30:58在网上也有很多把依赖文件打包进exe的方法,不过都只能打包一些图片或者文本而已。 另一种方法是通过修改PyInstaller配置文件*.spec来实现打包的方法,虽然挺不错,但是似乎不能移植到其他设备上。所以我翻阅文献后... -
python脚本打包成exe+配置文件
2021-03-31 11:03:331、python下安装pyinstaller: pip install pyinstaller 如果安装失败,返回一堆地址的选择(忘记截图)...打包结束后在当前文件夹生成dist和build两个文件夹和xxx.spec文件,其中dist文件夹中便是执行文件,里... -
python3_将多个.py文件打包成exe程序并添加图标
2021-04-13 11:42:11打包的项目为Tkinter目录下的所有python文件,其中test.py为主文件 2、打包流程 ① 生成主函数对应的spec文件,命令 在Tkinter路径下使用:pyi-makespec test.py 执行命令后,Tkinter目录下会生成test.spec文件 ... -
pycharm将python项目打包成exe运行文件
2020-12-22 16:28:31pycharm将python项目打包成exe运行文件 1:Python将 .py文件 打包成exe,首先需要安装 pyinstaller模块。安装步骤如下 2:打开Pycharm 终端 使用命令: 输入 pyinstaller -F XXXX.py /** *附参数集合: –icon=... -
win10安装python2.7和python3.6到打包成exe文件
2021-01-11 20:47:18win10 64位系统安装python2.7和python3.6,到打包成exe文件过程记录。1、下载python安装包python2.7下载地址:https://www.python.org/downloads/release/python-2715/python3.6下载地址:... -
Pyinstaller实现Python脚本打包成exe文件!全网最详细!
2021-05-02 12:26:06博主最近写完了最新版的东方...本文通过Pyinstaller实现Python程序打包成exe文件,好处主要有两点: 在任意一台没有Python环境的电脑上支持一键启动,无需配置任何参数(脚本路径需为相对路径)。 没有坏处。 ... -
python打包多个文件形成exe可执行文件
2021-09-08 18:08:31第一步: 安装pyinstaller ...#下面两个命令任选其一可以打包多个文件成为exe可执行文件 pyinstaller --onedir main.py 或 pyinstaller -D main.py #如果源文件只有一个,没有其他依赖文件那么需要执行下面的... -
将Python项目打包成EXE可执行文件(单文件,多文件,包含图片)
2019-04-18 21:33:001.当我们写了一个Python的项目时,特别是一个GUI项目,我们特备希望它能成为一个在Windows系统可执行的EXE文件,那么今天就来讲一下我是如何将我的GUI项目打包成一个EXE文件的你吧,其中有一些坑和遇到了一些错误,... -
python程序打包多个py文件_pyinstaller 把.py文件打包成可执行文件(.exe)
2020-11-21 16:07:34前言给小姐姐写了个python文件,功能实现了,但怎么给她呢。两种方案:直接给python文件,然后让她自行安装python。把python文件和python环境一起给她,她直接点点点即可。本着码农懒懒懒的精神,方案一不予通过, ... -
使用VScode编写python程序并打包成.exe文件
2021-03-05 16:22:18听说Visual Studio Code(VS Code)的诸多好处,了解了一下果真很喜欢,我喜欢它的缘由...html使用VScode编写第一个Python程序“one.py”,并将其打包成.exe文件。python演示使用的程序版本:python36,VScode1.27....