【python】打包神器--pyinstaller
- 1:简介
-
pyinstaller是一个python的第三方库,它能够在Windows、Linux、 Mac OS 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。在Windows上使用就打包成.exe文件。在Mac上使用就打包成mac app。
-
在Windows中打的包,只能在Windows中使用,在Mac中打的包只能在Mac中使用
-
最好配合虚拟环境使用
-
- 环境crm
- python.exe
- Scripts
- pip.exe
- pyinstaller.exe
- Lib
- site-package
- requests
- flask
- pyinstaller
- 2.多文件打包
- 2.1:安装pyinstaller,pip install pyinstaller
- 2.2:写一个简单脚本
import requests
pram = {
'query':"哈哈",
}
url = 'https://www.sogou.com/web'
response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)
input('按回车键结束任务.....')
-
2.3:终端执行,pyinstaller -D demo.py,执行完成后,会生成下面几个文件,dist文件夹下,就会生成我们需要的exe执行文件
-
2.4:执行结束后,将dist下面的文件打包给其他人,直接点击可执行文件即可执行。
-
3.单文件打包
- 3.1:上面的打包,会生成很多文件,dist下面的所有文件必须一起打包给别人才能执行,这样比较麻烦,如果能够打包成一个可执行文件,就会更方便了。
- 3.2:终端执行,pyinstaller -F demo.py
- 3.3: 注意,**打包成一个文件,并不代表只是单独的一个文件,当我们执行程序时,也会临时生成多个文件,只是执行完就删除了,我们无感知
-
4.路径问题,如果我们的代码需要依赖其它文件,处理方法
- 4.1:多文件打包
- 4.1.1:代码及依赖文件
- 4.1:多文件打包
import requests
import os
pram = {
'query':"哈哈",
}
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(BASE_DIR, "info.txt")) as f:
data = f.read()
url = data.strip()
response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)
input('按回车键结束任务.....')
- 4.1.2:打包后,直接将依赖文件放到 _internal文件夹中
- 4.2:单文件打包
- 4.2.1:单文件打包后,无论怎么放置依赖文件都不行,看下面的报错信息,这就是我们上文所提到的临时目录,这里找不到info.txt所以报错
- 4.2.2:这里有几种解决方法
- 1):取巧,将依赖文件放置到D盘固定目录下,脚本中也修改为固定路径,缺点:数据与代码分开,不便于管理
- 2):sys.argv[0]表示代码本身文件路径
- 修改路径:BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
- 打包后,将依赖文件放到可执行文件同目录即可
- 3):frozen,打包后,依赖文件放置到可执行文件同目录也可以正常执行
- 4.2.1:单文件打包后,无论怎么放置依赖文件都不行,看下面的报错信息,这就是我们上文所提到的临时目录,这里找不到info.txt所以报错
import sys
if getattr(sys, 'frozen', False): # True
print('running in a PyInstaller bundle') # 使用pyinstaller执行
else: # False
print('running in a normal Python process') # python正常的文件
import sys
import requests
import os
pram = {
'query':"哈哈",
}
# BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
if getattr(sys, 'frozen', False):
# pyinstaller打开
BASE_DIR = os.path.dirname(sys.executable)
else:
# py文件路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# https://www.sogou.com/web
with open(os.path.join(BASE_DIR, "info.txt")) as f:
data = f.read()
url = data.strip()
response = requests.get(url=url,params=pram)
page_text = response.text
print(page_text)
input('按回车键结束任务.....')
- 5.基于反射的动态模块加载
- 5.1:目录及脚本
- 5.2:这里我们在打包时,pyinstaller是不可能自动帮你选择模块的
- 5.3:打包
- 5.4:基于配置文件打包,第3步中打包后,删除其它文件,保留spec文件即可
- 5.5:运行
- 5.1:目录及脚本