Python glob无法匹配指定模式文件问题求助(Linux容器环境)
解决思路
先定位问题场景
首先明确你的Python脚本是在宿主机运行(调用Docker执行命令)还是容器内部运行(直接在容器里处理文件),两种场景的问题原因不同:
场景1:脚本在宿主机,调用Docker时传递通配符路径
问题大概率是宿主机Shell提前解析了通配符,而非容器内部解析。比如你用类似subprocess.run('docker exec my_container import /mnt/*.csv', shell=True)的命令时,宿主机Shell会先尝试展开/mnt/*.csv——如果宿主机的/mnt目录没有匹配文件,会把带*的原字符串传给容器,但容器内的命令可能不会再解析通配符;如果宿主机有匹配文件,会把宿主机的文件列表传给容器,自然和容器内的文件不匹配。
解决办法:
- 让容器内部的Shell处理通配符:把命令用容器的shell包裹执行,比如:
这样docker exec my_container sh -c 'import /mnt/*.csv'*会由容器内部的Shell展开,匹配容器内/mnt下的文件。 - 若调用容器内的Python脚本,直接传递通配符字符串,让容器内的脚本用
glob模块自行解析,而非在宿主机提前展开。
场景2:脚本在容器内部运行,用glob匹配/mnt路径
如果手动在容器内ls /mnt能看到文件,但glob.glob('/mnt/*')返回空,排查以下几点:
- 权限问题:容器运行用户无
/mnt目录的读取权限。执行ls -ld /mnt查看目录权限,再用id查看当前运行用户,确认用户有读权限(可尝试给目录加o+r权限,或让容器以root用户运行测试)。 glob参数错误:若要匹配子目录文件,需启用递归:glob.glob('/mnt/**/*', recursive=True);若只是当前目录,确认路径无转义(比如不要写/mnt\*)。- 文件系统缓存问题:极少数情况容器内文件系统缓存导致
glob无法识别新文件,可重启容器,或用os.listdir('/mnt')替代glob测试,判断是glob模块问题还是文件系统问题。 - 挂载验证:确认
/mnt是正确挂载的宿主机目录,执行docker inspect my_container查看挂载配置,确保宿主机源路径有文件且挂载正常。
通用排查步骤
- 手动进入容器执行
ls /mnt,确认文件存在。 - 在容器内直接运行Python测试
glob:
若能返回文件列表,问题出在宿主机调用Docker的方式;若仍为空,问题在容器内的权限或路径配置。import glob print(glob.glob('/mnt/*')) - 检查Docker挂载命令,确保
-v参数的宿主机路径和容器路径正确,无权限限制。
内容的提问来源于stack exchange,提问作者Justin Cohen
相关产品推荐
相关产品推荐

