You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中sys.argv[1]传入glob()返回空列表问题求助

问题原因与解决办法

这个问题我之前也碰到过,本质是shell的通配符提前展开导致的,和glob模块本身没关系。

为什么会出现这个情况?

当你在命令行执行python analysis.py *.xlsx时,你的shell(比如bash、zsh这类终端壳程序)会先拦截*.xlsx这个通配符,自己先做匹配:

  • 如果当前目录下有符合.xlsx的文件,shell会把*.xlsx直接替换成所有匹配的文件名列表,比如变成python analysis.py report1.xlsx report2.xlsx。这时候你的代码里sys.argv[1]拿到的是report1.xlsx,再用glob.glob('report1.xlsx')自然只会返回这个文件本身(如果存在),完全偏离了你想用通配符批量匹配的预期;
  • 如果当前目录下没有匹配的文件,有些shell(比如bash的默认设置)会把*.xlsx原样传给Python,这时候glob才能正常工作——但这是特殊情况,不是所有shell都遵循这个逻辑。

而你手动赋值dated = '*.xlsx'时,字符串没有经过shell的预处理,直接被glob解析,所以能正常匹配到目标文件。

解决办法

有两种常用的处理方式,你可以根据需求选择:

1. 让shell不展开通配符(推荐,保持glob的原始逻辑)

在命令行输入参数时,用单引号或双引号把通配符括起来,明确告诉shell“这是一个完整的字符串,不要解析它”:

python analysis.py '*.xlsx'
# 或者
python analysis.py "*.xlsx"

这样sys.argv[1]就能拿到原始的*.xlsx字符串,glob可以正常解析通配符并返回所有匹配的文件。

2. 兼容shell展开的情况(支持多参数输入)

如果你希望不管用户有没有加引号,代码都能正常工作,可以修改代码,遍历所有传入的参数(而不是只取第一个):

import sys
import glob

all_files = []
# 遍历命令行传入的所有参数(跳过脚本名sys.argv[0])
for pattern in sys.argv[1:]:
    all_files.extend(glob.glob(pattern))

print(all_files)

这种方式下:

  • 如果用户加了引号,sys.argv[1:]是通配符字符串,glob会解析并返回匹配文件;
  • 如果用户没加引号,sys.argv[1:]是已经展开的文件名列表,glob会逐个确认文件存在并返回。

内容的提问来源于stack exchange,提问作者Mowgli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:17:47