PyInstaller打包Hello World程序遇权限报错及缺失dll问题求助
报错根因说明
1. 初始PermissionError报错
该报错与目录写权限、管理员权限无关,属于命令参数使用错误:
- PyInstaller 的命令行规则中,不带
-/--前缀的位置参数,默认全部识别为「待打包的入口Python脚本」,不存在“指定build输出目录”的位置参数用法。 - 你执行的
pyinstaller main.py build,等价于要求PyInstaller同时打包main.py和build两个脚本。从日志里的Analyzing D:\development\PycharmProjects\pythonProject\test1\build可以验证:PyInstaller此时不是要往build目录写构建文件,而是要将这个路径作为脚本读取。 - 尝试读取build路径时,PyInstaller发现该路径是目录,不符合脚本文件的读取要求,因此抛出PermissionError,报错信息本身有一定误导性,实际是路径类型不匹配导致的读取失败。
2. 去掉build参数后exe缺失python39.dll
由两个因素叠加导致:
- 你使用的PyInstaller 4.2是2020年发布的早期版本,对刚推出的Python 3.9.1的Windows打包支持不完善,存在漏捆绑核心运行dll的已知bug。
- PyInstaller默认打包模式为
onedir:最终生成的exe位于dist/main/main.exe,必须和同目录下的python39.dll、依赖文件夹等所有文件保持相对位置不变才能运行;如果单独把main.exe拷贝到其他位置运行,就会触发缺失dll的报错。
正确操作流程
- 清理旧构建残留:手动删除项目目录下自动生成的
build、dist文件夹,以及main.spec文件,避免旧缓存干扰新构建。 - 修正命令参数逻辑:PyInstaller 中如果需要自定义构建、输出路径,必须使用带
--前缀的选项参数,不能将目录名直接作为位置参数传入。
常用可运行的命令参考:- 生成无需附带依赖文件的单个独立exe:
pyinstaller --onefile main.py- 自定义临时构建目录和最终输出目录:
pyinstaller --onefile --workpath=临时构建目录 --distpath=最终输出目录 main.py - 升级PyInstaller解决兼容问题:当前使用的4.2版本对Python 3.9兼容性较差,升级到适配版本即可:
pip install --upgrade pyinstaller - 构建完成后直接在输出目录运行exe测试:如果使用默认
onedir模式,不要随意拆分exe和同目录的依赖文件。
补充排错提示
如果升级PyInstaller后打包仍然提示缺失api-ms-win-core-path-l1-1-0.dll,说明本地Python 3.9.1安装包的运行库不完整,重新安装同版本Python即可修复。
内容的提问来源于stack exchange,提问作者Binyamin Regev
相关产品推荐
相关产品推荐

