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

Trying to read list of tuples with date-pairs in bash is failing using argparse

提问人:Reut 提问时间:9/27/2023 更新时间:9/28/2023 访问量:79

问:

我有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 元组 argparse

评论

1赞 blhsing 9/27/2023
请使用初始化的代码更新您的问题,这是错误消息实际抱怨的内容。date_range
0赞 fakedad 9/27/2023
我认为更完整的示例代码在这里会有所帮助。这真的是你的全部功能吗?您不会返回任何东西。parse_args
0赞 Reut 9/27/2023
我认为问题出在argparse上,而不是函数的另一部分,这就是为什么我没有把它放在这里。该函数调用了很多其他函数,所以我认为在这里提出一个问题的信息太多了
1赞 fakedad 9/27/2023
您共享的代码似乎没有任何问题(除了可能没有初始化的事实)。您可以考虑制作 MCVE。这样做的过程也可能有助于您自己找到问题。parser
0赞 hpaulj 9/27/2023
看。有时您还需要查看以验证您的报价是否正确。args.date_listsys.argv

答:

1赞 hpaulj 9/28/2023 #1

使用此脚本,从示例修改并添加了打印:

import ast
import argparse
import sys

def parse_args():
    '''Parser for my script '''
    parser = argparse.ArgumentParser()
    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()
    print(args)

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

print(sys.argv)
parse_args()

几个示例运行:

(base) C:\Users\14256\Downloads>
(base) C:\Users\14256\Downloads>python test.py
['test.py']
Namespace(date_list=None)

(base) C:\Users\14256\Downloads>python test.py --date_list "[('2017-07-02','2020-03-02')]"
['test.py', '--date_list', "[('2017-07-02','2020-03-02')]"]
Namespace(date_list="[('2017-07-02','2020-03-02')]")
[('2017-07-02', '2020-03-02')]

这不是 ,而是带有一些 Anaconda 路径设置的 Windows。但需要注意的关键事项bash

  • shell 和 在 中创建一个字符串列表。我们可以查看,甚至可以直接解析 - 无需使用,解析是直接的。pythonsys.argvargparse

  • 但正如 所定义的那样,这些字符串被分配给命名空间中的属性。不处理字符串。add_argumentargs

  • 这里的处理取决于您的代码。args.date_list

ast已将该字符串解析为包含一个元组的列表。该元组包含两个字符串。

因此,可以对返回列表进行索引以获取这些字符串中的第二个。date_list[0][1]

对于一个好的问题,你需要展示(并理解)做什么和返回什么。您显示的错误涉及您未显示的代码:。我只能猜测这与 argparse 代码的关系。它看起来像一个字符串,因为它的措辞与以下人员生成的措辞相同:argparsedate_range[LOC_1]date_range

 'asstring'[20]
 ''[0]