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 打包完之后,文件小了很多
在虚拟环境中没有其它未使用的库,这样打的包会小很多。