Knowhow/Python, Pytorch

argparse 사용 시 list를 argument로 넘겨주기

침닦는수건 2024. 11. 13. 16:51
반응형

python 코딩할 때 무조건 쓰게 되는게 argparse인데 argument로 list를 전달해야 될 때 귀찮은 일이 많다.

 

예를 들어, 아래와 같이 쓰면 될 것이라고 쓰면 된다고 생각하는데

parser = argparse.ArgumentParser()
parser.add_argument("--something", type=list)

args= parser.parse_args()

 

이렇게 하면 python run.py --something a b c 와 같이 썼을 때 오류 난다. 의도와 다르게 된다.

 

정석

이 대신 아래와 같이 쓰는게 좋다.

parser = argparse.ArgumentParser()
parser.add_argument("--something", nargs="+")
args= parser.parse_args()

 

n_args="+"로 설정하면 --something 뒤에 띄어쓰기로 구분된 N개의 argument를 받을 수 있다. 

 

args.something 열어보면 list로 들어있다. 

 

트릭

커맨드 라인에서 직접 타이핑을 할 것이라면 위와 같이 nargs="+"를 쓰면 되는데, 만약 코드에서 list 변수 자체를 넘겨주고자 할 때는 조금 더 귀찮다.

 

예를 들어, 다음과 같은 구조하고 해보자.

import os
list_arguments = ["a", "b", "c", "d", ...]

os.system(f"python run.py --something {list_arugments}") # it fails.

 

이 경우, nargs="+"를 설정하든 type=list를 설정하든 오류 난다.

 

이 때는 약간의 잔머리를 굴려 string으로 넘겨받는게 낫다.

import os
list_arguments = ["a", "b", "c", "d", ...]

list_str = "@".join(list_arguments) # a@b@c@d..., @ is just indicator for split

os.system(f"python run.py --something {list_str}") # --something : type=str

### inside run.py

list_arguments = args.list_str.split("@")

 

이렇게 쓰는게 정신 건강에 이롭다.

반응형