我有一个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 运行脚本时如何使用日期列表参数的解决方案。
我认为这是因为您在 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)