尝试使用 argparse 读取 bash 中带有日期对的元组列表失败

问题描述 投票:0回答:1

我有一个Python脚本,它的参数之一是元组列表:

def my_func(my_date_list: list=None, #List of dates to be used. Example for list : [('2017-07-02', '2017-08-15'),('2019-09-02', '2019-11-21')]):

...

当我从 Jupyter 笔记本运行该函数时,该函数可以正常工作。 但是,当我尝试在 bash 上运行它时,它无法真正正确访问日期。 这就是我使用 argparse + bash 命令所做的:

import ast

def parse_args():
    '''Parser for my script '''
    
    parser.add_argument('--date_list',type=str, default=None, required=False,
                        help=f"#List of dates to be used. Example for list : [('2017-07-02', '2017-08-15'),('2019-09-02', '2019-11-21')]")      

    args = parser.parse_args()

    if args.date_list is not None:
        date_list = ast.literal_eval(args.date_list)
        print(date_list)

我的 bash 命令:

python3 main_func.py --date_list "[('2017-07-02','2020-03-02')]"
#this fails when the script gets to the part where it should worlk with the date
>>>end_date=date_range[LOC_1],
>>>IndexError: string index out of range

值得一提的是,这个脚本在从我的 Jupyter 笔记本运行时确实可以工作,所以我相信问题在于解析参数
我正在寻找从 bash 运行脚本时如何使用日期列表参数的解决方案。

python bash list tuples argparse
1个回答
0
投票

我认为这是因为您在 bash 中将日期列表作为命令行参数传递,当您在引号中传递参数时,它被视为单个字符串而不是列表,所以最好这样做:

python3 main_func.py --date_list "[(('2017-07-02', '2017-08-15'),('2019-09-02', '2019-11-21'))]"

并在您的Python脚本中尝试编辑

parse_args()
函数来处理日期列表参数,而不使用
ast.literal_eval()
,因为您可以使用
json.loads()

直接解析列表的字符串表示形式

看看这个:

import json

def parse_args():
    '''Parser for my script '''
    
    parser.add_argument('--date_list', type=str, default=None, required=False,
                        help=f"List of dates to be used. Example for list: "
                             f"[('2017-07-02', '2017-08-15'), ('2019-09-02', '2019-11-21')]")      

    args = parser.parse_args()

    if args.date_list is not None:
        date_list = json.loads(args.date_list)
        print(date_list)
© www.soinside.com 2019 - 2024. All rights reserved.