Python脚本在Bash中通过argparse读取日期元组列表失败,求解决方案
问题分析与解决方案
你的问题出在两个核心环节:参数解析后的变量未正确传递,以及可能存在的Bash引号解析干扰,具体解决如下:
1. 修复参数解析函数
你的parse_args函数中,用ast.literal_eval解析出了元组列表,但仅存于局部变量date_list中,未更新回args对象。主函数若直接使用args.date_list,拿到的还是原始字符串——当你尝试像列表那样索引(比如date_range[LOC_1])时,会把字符串当成字符序列处理,自然触发IndexError: string index out of range。
修改后的parse_args函数:
import argparse import ast def parse_args(): '''Parser for my script ''' # 注意:原代码遗漏了创建argparse实例的关键步骤 parser = argparse.ArgumentParser() parser.add_argument('--date_list', type=str, default=None, required=False, help="List of dates to be used. Example: [('2017-07-02', '2017-08-15'),('2019-09-02', '2019-11-21')]") args = parser.parse_args() if args.date_list is not None: # 将解析后的列表赋值回args,确保主函数能拿到正确的数据结构 args.date_list = ast.literal_eval(args.date_list) print(args.date_list) return args
主函数调用示例:
args = parse_args() # 此时args.date_list是解析后的元组列表,可直接传入my_func my_func(args.date_list)
2. 确保Bash传参格式正确
Bash的引号解析规则可能破坏传入的字符串结构,推荐两种可靠的传参方式:
方式一:转义内部单引号
用单引号包裹整个参数,内部的单引号通过'\''转义:
python3 main_func.py --date_list '[('\''2017-07-02'\'', '\''2020-03-02'\'')]'
方式二:用双引号包裹整个参数
Bash双引号内的单引号会被直接保留,可简化写法:
python3 main_func.py --date_list "[('2017-07-02','2020-03-02')]"
可选优化:用JSON替代ast.literal_eval
ast.literal_eval虽安全,但复杂场景下用JSON传递参数更稳定,还能减少引号转义的麻烦:
- 修改参数解析逻辑:
import json # 在parse_args中替换ast.literal_eval为json.loads if args.date_list is not None: # JSON不支持元组,先解析为列表再转回元组 date_list = json.loads(args.date_list) args.date_list = [tuple(item) for item in date_list]
- Bash传参使用数组格式:
python3 main_func.py --date_list '[["2017-07-02","2020-03-02"]]'
内容的提问来源于stack exchange,提问作者Reut
相关产品推荐
相关产品推荐

