Python whois功能打包为exe后报错缺失public_suffix_list.dat求助
PyInstaller/auto-py-to-exe打包后whois功能报错解决方案
根因说明
你使用的whois第三方库运行时需要加载自带的public_suffix_list.dat公共后缀数据文件,PyInstaller默认仅打包脚本依赖的.py格式模块,不会自动包含第三方库的非代码类资源文件,因此打包后的exe运行时解压到临时_MEIxxxx目录后找不到对应资源文件,触发路径不存在报错。
解决方案
方案1:打包时手动添加资源文件(推荐)
首先找到本地Python环境中whois库的资源文件路径,默认路径为Python安装目录下的Lib\site-packages\whois\data\public_suffix_list.dat,记录该路径后根据打包方式选择对应操作:
- 若使用auto-py-to-exe可视化工具打包:
- 打开工具后找到「高级」分类下的「添加数据」选项
- 点击新增,第一个输入框填写刚才找到的
public_suffix_list.dat本地完整路径,第二个输入框填写whois/data(即打包后资源存放的相对路径) - 重新执行打包即可
- 若直接使用PyInstaller命令行打包:
在原有打包命令后追加--add-data "本地资源路径;whois/data"参数即可,示例命令如下:
pyinstaller --noconfirm --onefile --windowed --exclude-module "_bootlocale" --add-data "C:\Users\shawn\AppData\Local\Programs\Python\Python39\Lib\site-packages\whois\data\public_suffix_list.dat;whois/data" "C:/Users/shawn/Documents/GitHub/pythonProjects/dnsQuery.py"
注意将示例中的路径替换为你本地的实际路径。
方案2:修改代码指定资源路径(备用)
如果不想每次打包都配置资源参数,可提前将public_suffix_list.dat放到脚本同级目录,在导入whois库前新增路径适配代码即可:
import os import sys # 适配打包运行与本地脚本运行两种场景的路径 if getattr(sys, 'frozen', False): # 打包后运行时的临时目录路径 base_path = sys._MEIPASS else: # 本地脚本运行时的当前目录路径 base_path = os.path.dirname(os.path.abspath(__file__)) # 手动指定whois所需的公共后缀列表文件路径 os.environ["PUBLIC_SUFFIX_LIST_URL"] = os.path.join(base_path, "public_suffix_list.dat") # 路径配置完成后再导入whois库 import whois
使用该方案打包时,记得将public_suffix_list.dat和脚本一起打包进exe即可。
内容的提问来源于stack exchange,提问作者Shawn Carron
相关产品推荐
相关产品推荐

