首页 > 编程语言 >Pyinstaller打包jieba时运行报错无dict.txt或idf.txt最优雅解决方案, 适用任何依赖非python文件的库

Pyinstaller打包jieba时运行报错无dict.txt或idf.txt最优雅解决方案, 适用任何依赖非python文件的库

时间:2022-08-29 16:44:27浏览次数:110  
标签:文件 jieba False python cipher 报错 txt

先给出解决方案:

1.打开并编辑xxx.spec(xxx与你的代码同名。如果没有该文件,使用命令pyi-makespec [-F] xxx.py生成,如果你要传入-F之类的参数要在这里就传入),打开后应为下面这个样子 

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(
    ['你的项目名.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
......

 

2.修改列表datas=[('你的python库路径/jieba','jieba')],

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(
    ['你的项目名.py'],
    pathex=[],
    binaries=[],
    datas=[('你的python库路径/jieba','jieba')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
......

 

3.使用命令Pyinstaller xxx.spec(现在不能传入-F之类的参数)

4.完美解决 


原理:

pyinstaller在打包时只会打包.py文件,txt之类的文件不会包含在里面,所以需要在spec中传入参数告诉pyinstaller要涵盖哪些文件。

.spec文件本质上是一个python文件(具体参考pyinstaller官网),其中datas是一个列表,要传入元素的是元组类型。元组中第一个参数可以是文件或文件夹,即需要打包到exe中的文件,因为jieba中有很多txt文件,所以这里直接传入jieba的文件夹路径。第二个参数是在临时文件夹中要处于的位置。查看报错信息(如下)

FileNotFoundError: [Errno 2] No such file or directory: '/var/folders/7x/6sl56wp93xq1k7ygjwfmmxlm0000gn/T/_MEIlyCutL/jieba/dict.txt

可知jieba访问的文件夹位置直接位于临时文件夹下(_MEI开头代表临时文件夹),所以第二个参数只传入"jieba"即可

另:

该方法适用任何你想打包到exe中的文件,例如我的程序需要一些音频素材,位于项目目录bin中,我只需要在datas中添加一个元组('bin','bin')即可,变成datas=[('bin','bin'),('venv/lib/python3.8/site-packages/jieba','jieba')],

标签:文件,jieba,False,python,cipher,报错,txt
From: https://www.cnblogs.com/banzhidabai/p/16636421.html

相关文章