Python代码打包成exe,出现“PermissionError: [Errno 13] Permission denied”

4 阅读2分钟

1.问题

最近在Windows上用python写了一个小工具,但是在打包的时候出现PermissionError: [Errno 13] Permission denied

在网上搜索资料以及问AI,给出的结论大多是因为于权限问题导致的。 给出的结论没有问题,但是在解决该问题的时候,发现报错一直存在,解决发方法包括:

  • 修改文件和文件夹的权限
  • 用管理员的身份启动
  • 关闭相关的进程、文件和文件夹等

上述方法都进行了尝试,未得到解决。

2.解决方法

最终使用的是:使用虚拟环境进行打包

在使用python进行开发时,使用的是Pycharm + Anaconda,在创建的每一个python项目都有一个单独的venv(虚拟环境) ,但是为了图方便,都会用Anaconda中的python.exe以及相关的库,这会导致权限限制以及打包的文件很大的问题(一些无用的文件也会打包进来)。

2.1 激活虚拟环境

激活环境比较简单

# 进入项目目录
cd 你的项目路径

# 激活虚拟环境
.venv\Scripts\activate

2.2 安装对应的包

根据项目的需要,安装对应的包。

# 安装包(现在pip会使用虚拟环境中的)
pip install 包名称

比如,使用的是

import pandas as pd
import numpy as np
from pathlib import Path
from openpyxl import load_workbook

安装

# 安装 pandas(会自动安装 numpy 作为依赖)
pip install pandas

# 如果只安装 numpy
pip install numpy

# 安装 openpyxl(用于处理Excel文件)
pip install openpyxl

# 或者一次性安装所有包
pip install pandas numpy openpyxl

2.3 检查pyinstaller

在虚拟环境中安装完相关库之后,发现在打包的时候还会去加载Anaconda目录下的库,原因在于pyinstaller还是使用的是Anaconda下的。

需要在虚拟环境中安装pyinstaller

# 基本安装
pip install pyinstaller

安装完使用where查看,发现会有两个,需要使用虚拟环境中的pyinstaller

(venv) F:\***\***>where pyinstaller
F:\***\***\venv\Scripts\pyinstaller.exe
D:\***\Anaconda\install\Scripts\pyinstaller.exe

2.4 打包

在打包的时候,直接在命令行窗口进行打包,没有使用PyCharm。

打包命令,使用的绝对路径

F:\***\***\venv\Scripts\pyinstaller.exe -D handledata.py

打包成功,在dist目录下生成对应的exe。

2.5 其它问题

2.5.1 在打包的时候,出现文件或者文件夹未关闭

PermissionError: [WinError 5] 拒绝访问。: 'F:\\***\\***\\dist\\handledata\\file\\**.xlsx'

这种情况,直接关闭文件夹或者文件。

2.5.2 打包完之后,文件小了很多

在虚拟环境中没有其它未使用的库,这样打的包会小很多。