lxplus服务器PyROOT代码创建目录时PermissionError问题求助
解决lxplus上PyROOT代码的PermissionError问题
错误原因
报错显示PermissionError: [Errno 13] Permission denied: '/DiTauHLT_Efficiency',核心问题是代码尝试在系统根目录(/)下创建文件夹,而普通用户没有根目录的写入权限。
这是因为初始opath为空时,第一次路径拼接opath = opath +"/"+hist2.GetName()会生成以/开头的绝对路径(比如/DiTauHLT_Efficiency),直接指向根目录。
修复步骤
1. 指定有权限的初始输出路径
调用loop2Dir时,不要传空字符串作为opath,改用相对路径或用户主目录下的绝对路径:
- 相对路径示例:
output_path_op = "./DiTauHLT_Efficiency"(会在当前脚本所在目录创建文件夹) - 绝对路径示例:
output_path_op = "/afs/cern.ch/user/j/joaquin/DiTauHLT_Efficiency"(替换为你的lxplus用户目录路径)
2. 简化并修复mkdir_p函数的异常逻辑
原函数的异常处理存在逻辑冗余,Python 3.2+的os.makedirs支持exist_ok=True参数,可直接简化为:
import os import errno def mkdir_p(path): try: os.makedirs(path, exist_ok=True) except OSError as exc: # 只有当路径已存在但不是目录,或者其他权限/系统错误时才抛出异常 if exc.errno != errno.EEXIST or not os.path.isdir(path): raise
3. 修正递归调用的参数错误
看代码中第178行的递归调用:
loop2Dir(obj1,obj2,spec1,spec2,opath)
而函数定义是loop2Dir(hist1,hist2,spec1,spec2,n,opath=""),这里少传了n参数,会导致后续参数错位,可能进一步引发路径拼接错误。修正为:
loop2Dir(obj1,obj2,spec1,spec2,n,opath)
额外检查
- 确认目标路径所在的AFS目录有写入权限:可以先用
touch test.txt在目标路径下创建测试文件,验证权限是否正常。 - 避免硬编码绝对路径,尽量用相对路径或通过
os.path.expanduser("~/your_dir")获取用户主目录路径,增强代码兼容性。
内容的提问来源于stack exchange,提问作者Joaquin Barraza
相关产品推荐
相关产品推荐

