Pyinstaller打包spacy库时失败

1.问题描述

在使用pyinstaller打包包含spacy库的文件时出错,点击可执行文件exe时,程序闪退,通过在cmd中输入“.\文件名.exe”可以看到具体错误的原因,全部都是提示类似下图这样的错误,都是提示某些模块缺失,无法导入某些名字等
在这里插入图片描述

2.问题分析

首先查看了spacy的依赖库,如下图所示,发现是spacy有很多依赖库,而提示的错误基本也都是这些依赖库的问题,所以最后发现问题原因就是在主程序中没有显示的导入这些依赖库,因此打包时没有将这些依赖库给打包起来,从而造成exe文件运行失败。
在这里插入图片描述

3.解决办法

(1)步骤1
将隐式导入的库通过显示的方式导入,将.spec文件中的hiddenimports修改为

hiddenimports=['srsly.msgpack.util', 'cymen', 'thinc', 'srsly', 'requests', 'plac', 'preshed', 'wasabi', 'cymem', 'murmurhash', 'blis','cymem.cymem', 'preshed.maps', 'thinc.linalg', 'thinc.neural._aligned_alloc', 'blis.py', 'spacy.strings', 'pkg_resources.py2_warn', 'spacy.morphology','thinc.extra.search','spacy._align','spacy.matcher.dependencymatcher','spacy.syntax.nonproj','spacy.language','spacy.cli.debug_data','spacy.tokens','spacy.matcher.matcher','spacy.cli.download','spacy.lang.en.tag_map','spacy.displacy.templates','spacy.lang.en.lemmatizer._adverbs_irreg','spacy.pipeline','spacy.cli.converters.conll_ner2json','spacy.about','spacy.cli.pretrain','spacy.lang.en.lemmatizer._adjectives_irreg','spacy._ml','spacy.gold','spacy.tokens.token','spacy.lang.en.lemmatizer','spacy.matcher.phrasematcher','spacy.lang.en.tokenizer_exceptions','spacy.cli.link','spacy.displacy.render','spacy.lang.en.lemmatizer._adverbs','spacy.lang.en.morph_rules','spacy.cli.profile','spacy.cli.train','spacy.pipeline.hooks','spacy.lang.en.lemmatizer._verbs_irreg','spacy.cli.info','spacy.glossary','spacy.attrs','spacy.lang.en.syntax_iterators','spacy.compat','spacy.lang.tokenizer_exceptions','spacy.tokens.underscore','spacy.lang.en','spacy.symbols','spacy.pipeline.entityruler','spacy.syntax.arc_eager','spacy.vectors','spacy.lang.en.lemmatizer._nouns_irreg','spacy.matcher._schemas','spacy.pipeline.pipes','spacy.lang','spacy.errors','spacy.syntax.transition_system','spacy.lang.char_classes','spacy.cli.init_model','spacy.tokenizer','spacy.cli','spacy.lang.en.lex_attrs','spacy.lang.norm_exceptions','spacy.cli.evaluate','spacy.pipeline.functions','spacy.lexeme','spacy.lang.en.lemmatizer.lookup','spacy.syntax._beam_utils','spacy.util','spacy.cli.convert','spacy.syntax._parser_model','spacy.lang.en.norm_exceptions','spacy','spacy.cli.validate','spacy.parts_of_speech','spacy.vocab','spacy.cli.converters.conllu2json','spacy.cli.converters.iob2json','spacy.morphology','spacy.tokens._retokenize','spacy.kb','spacy.lang.en.stop_words','spacy.syntax.stateclass','spacy.syntax','spacy.lang.en.lemmatizer._lemma_rules','spacy.lang.en.lemmatizer._verbs','spacy.lang.punctuation','spacy.cli.package','spacy.scorer','spacy.cli.converters.jsonl2json','spacy.lang.en.lemmatizer._nouns','spacy.lang.en.lemmatizer._adjectives','spacy.cli.converters','spacy.tokens.doc','spacy.syntax.ner','spacy.lang.tag_map','spacy.matcher','spacy.lemmatizer','spacy.strings','spacy.tokens.span','spacy.displacy','spacy.syntax.nn_parser','spacy.lang.lex_attrs']

(2)步骤2
创建并保存下述.py文件至 → python环境地址\Lib\site-packages\PyInstaller\hooks,此目的是将spacy库所需的模型数据一起打包

from PyInstaller.utils.hooks import collect_data_files
 
datas = collect_data_files("en_core_web_sm")

(3)步骤3
在需打包的文件中使用下述方法导入spacy库
import en_core_web_sm
nlp = en_core_web_sm.load()

修改完成后,使用pyinstaller -D 文件名.spec即可打包成功,并能够成功使用spacy

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想打包自定义库,确保你已经安装了PyInstaller,并按照以下步骤进行操作: 1. 创建你的自定义库。这可以是一个Python模块或一个包含多个模块的包。确保你的库可以在你的开发环境中正常工作。 2. 在你的项目中,创建一个入口脚本(例如,main.py)来调用你的自定义库。这个脚本应该是你打包的起点。 3. 打开终端,并转到你的项目目录中。 4. 运行以下命令来生成一个.spec文件: ``` pyi-makespec --onefile main.py ``` 5. 打开生成的.spec文件(例如,main.spec),你可以在其中找到一个名为`Analysis`的部分。 6. 在`Analysis`部分中,添加你的自定义库的路径。如果你的自定义库是一个单独的模块,可以使用以下代码: ``` a = Analysis(['main.py'], pathex=['path/to/your/library'], ...) ``` 如果你的自定义库是一个包含多个模块的包,可以使用以下代码: ``` a = Analysis(['main.py'], pathex=['path/to/your/package'], ...) ``` 7. 保存并关闭.spec文件。 8. 在终端中运行以下命令来打包你的程序: ``` pyinstaller main.spec ``` 9. 打包完成后,在生成的`dist`目录中,你将找到一个可执行文件,其中包含了你的自定义库。 请注意,打包自定义库可能会涉及到其他的依赖项和配置。确保你的自定义库和相关依赖在打包时都能正确地被包含进去。如果有其他特殊需求或问题,建议查阅PyInstaller的文档或相关库的文档以获取更详细的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值