运行Python脚本持续触发WinError 32,创建临时目录仍无法解决
ArcGIS Online图层备份脚本WinError 32文件占用问题
问题概述
编写Python脚本备份ArcGIS Online图层时,持续触发WinError 32文件占用错误,尝试创建临时目录等方法无效。
使用的代码
# 创建临时目录,因为我一直遇到文件占用错误,但这也没用 lol import tempfile with tempfile.TemporaryDirectory() as tmpdir: print('created temporary directory', tmpdir) # 导入必要模块 import arcgis from arcgis.gis import GIS # 创建GIS对象 gis = GIS("insert_link", "username", "password") # 获取要复制的图层对应的项 layer_item = gis.content.get("layer_ID") # 创建图层副本 copy_item = layer_item.copy() # 查找并删除该图层的旧副本 for item in gis.content.search(query="title:'Copy of {}'".format(layer_item.title)): if item.type == "Feature Layer": item.delete() # 保存新的图层副本 copy_item.save() # 总有一天我会看到这句话 print("File Downloaded")
报错信息
C:\Users\SeanW\anaconda3\envs\MeganScriptTests\python.exe C:\Users\SeanW\PycharmProjects\AGOLBackup3\main.py created temporary directory C:\Users\SeanW\AppData\Local\Temp\tmpj0yvbg64 Traceback (most recent call last): File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\importlib\_common.py", line 92, in _tempfile os.write(fd, reader()) File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\importlib\abc.py", line 371, in read_bytes with self.open('rb') as strm: File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\importlib\_adapters.py", line 54, in open raise ValueError() ValueError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\SeanW\PycharmProjects\AGOLBackup3\main.py", line 7, in <module> import arcgis File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\arcgis\__init__.py", line 3, in <module> from arcgis.auth.tools import LazyLoader File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\arcgis\auth\__init__.py", line 1, in <module> from .api import EsriSession File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\arcgis\auth\api.py", line 11, in <module> certifi_win32.wincerts.verify_combined_pem() File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\certifi_win32\wincerts.py", line 65, in verify_combined_pem with open(certifi_pem()) as certifi_pem_handle: File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\certifi_win32\wincerts.py", line 52, in certifi_pem import certifi File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\wrapt\importer.py", line 177, in _exec_module notify_module_loaded(module) File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\wrapt\decorators.py", line 470, in _synchronized return wrapped(*args, **kwargs) File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\wrapt\importer.py", line 136, in notify_module_loaded hook(module) File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\certifi_win32\wrapt_certifi.py", line 20, in apply_patches certifi_win32.wincerts.CERTIFI_PEM = certifi.where() File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\site-packages\certifi\core.py", line 72, in where _CACERT_PATH = str(_CACERT_CTX.__enter__()) File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\contextlib.py", line 135, in __enter__ return next(self.gen) File "C:\Users\SeanW\anaconda3\envs\MeganScriptTests\lib\importlib\_common.py", line 98, in _tempfile _os_remove(raw_path) PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\SeanW\\AppData\\Local\\Temp\\tmpx9og0v3t' Process finished with exit code 1
已尝试的解决方案
- 切换至Python 3.11,出现无法打开孤立路径错误,无解决思路
- 在其他电脑运行脚本,仍出现相同问题
- 卸载
python-certifi-win32包,错误依旧 - 将临时目录后的代码缩进,未解决WinError 32问题
解决方案建议
1. 清理certifi依赖冲突
从报错栈看,问题根源在certifi和certifi_win32的文件操作冲突。彻底卸载这两个包后重新安装纯净版certifi:
pip uninstall -y certifi certifi-win32 pip install certifi
ArcGIS API for Python本身不需要certifi_win32,无需重新安装。
2. 调整脚本导入与执行顺序
把模块导入放在最开头,临时目录和业务逻辑放在同一代码块内,避免导入阶段的资源占用冲突:
# 先导入所有必要模块 import arcgis from arcgis.gis import GIS import tempfile # 统一在临时目录上下文内执行备份逻辑 with tempfile.TemporaryDirectory() as tmpdir: print('created temporary directory', tmpdir) # 创建GIS对象 gis = GIS("insert_link", "username", "password") # 获取目标图层 layer_item = gis.content.get("layer_ID") # 创建副本 copy_item = layer_item.copy() # 删除旧副本 for item in gis.content.search(query="title:'Copy of {}'".format(layer_item.title)): if item.type == "Feature Layer": item.delete() # 保存新副本 copy_item.save() print("File Downloaded")
3. 指定自定义临时目录
如果系统默认临时目录存在权限或占用问题,手动指定一个非系统默认的临时目录:
import os import tempfile import arcgis from arcgis.gis import GIS # 自定义临时目录路径 custom_tmp_dir = r"C:\MyCustomTempDir" os.makedirs(custom_tmp_dir, exist_ok=True) # 使用自定义目录执行逻辑 with tempfile.TemporaryDirectory(dir=custom_tmp_dir) as tmpdir: print('created temporary directory', tmpdir) # 后续备份逻辑...
4. 安装兼容版本的ArcGIS API
当前ArcGIS API版本可能与Python环境不兼容,尝试安装稳定兼容版(Python 3.9-3.10推荐2.2.x系列):
pip install arcgis==2.2.0
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

