Python脚本用sys.argv传通配符参数在Windows执行失败如何解决
问题原因
Linux/Unix系统的shell会自动将命令中的通配符(比如*.txt)展开为匹配到的所有文件路径列表,再传给Python脚本;但Windows系统的PowerShell/CMD默认不会做通配符展开,会直接把logs/*.txt作为完整字符串参数传给脚本,导致脚本尝试打开名称带*的不存在的文件,触发OSError。
解决方案
方法1:修改调用命令(无需改动脚本)
在Anaconda PowerShell中执行命令时,先手动触发通配符展开再传递给脚本,命令如下:
python script_name.py (Get-ChildItem logs\*.txt | ForEach-Object { $_.FullName }) # 简化写法 python script_name.py (gci logs\*.txt).FullName
这种方法适合没有脚本修改权限、仅需临时运行的场景。
方法2:修改脚本适配跨平台通配符(推荐)
在脚本内部增加通配符展开逻辑,不管系统shell是否做展开,都能自动处理通配符参数,修改后完整代码如下:
import sys import json import glob from pathlib import Path def main(): filenames = [] # 逐个处理传入参数,自动展开通配符 for pattern in sys.argv[1:]: filenames.extend(glob.glob(pattern)) for filename in filenames: path = Path(filename) # 可选增加encoding参数避免Windows编码问题 with path.open(encoding='utf-8') as file: text = file.read() a = json.loads(text) if __name__ == "__main__": main()
修改后在Windows PowerShell中直接执行python script_name.py logs/*.txt即可正常运行,同时兼容Linux系统的原有调用方式。
内容的提问来源于stack exchange,提问作者Theo75
相关产品推荐
相关产品推荐

