运行Streamlit应用时出现PermissionError: [Errno 13]的解决方法
解决Streamlit+Camelot提取PDF表格时的PermissionError问题
问题原因
在Windows系统中,NamedTemporaryFile默认以独占读写模式创建文件。当你在with块内调用extract_table时,临时文件还被当前Streamlit进程占用,Camelot尝试读取这个被锁定的文件就会触发权限拒绝错误。
解决方案
方案1:关闭临时文件后再读取(推荐)
修改代码,先将上传的文件写入临时文件并关闭,再让Camelot读取,用完后手动删除临时文件:
import os from tempfile import NamedTemporaryFile # ... 其他代码 ... if submitted: # 创建临时文件,设置delete=False避免自动删除 with NamedTemporaryFile(dir='.', suffix='.pdf', delete=False) as f: f.write(st.session_state['uploaded_file'].getbuffer()) # 此时文件已关闭,Camelot可正常读取 df = extract_table(f.name, page_number, ['107', '420.1', '286', '262.1']) # 手动清理临时文件 os.unlink(f.name)
方案2:使用系统默认临时目录
如果当前工作目录(C:\ect_streamlit)本身存在权限限制,可以改用系统默认的临时目录(通常权限配置更合理),无需指定dir参数:
import os from tempfile import NamedTemporaryFile # ... 其他代码 ... if submitted: with NamedTemporaryFile(suffix='.pdf', delete=False) as f: f.write(st.session_state['uploaded_file'].getbuffer()) df = extract_table(f.name, page_number, ['107', '420.1', '286', '262.1']) os.unlink(f.name)
额外排查点
- 若仍报错,检查
C:\ect_streamlit目录是否需要管理员权限才能写入,尝试以管理员身份启动VSCode后再运行Streamlit。 - 确认Camelot依赖的
ghostscript已正确安装并配置到系统环境变量中(部分情况下权限问题也可能是依赖工具的路径权限导致)。
内容的提问来源于stack exchange,提问作者jevic
相关产品推荐
相关产品推荐

