반응형
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("@")
이렇게 쓰는게 정신 건강에 이롭다.
반응형
'Knowhow > Python, Pytorch' 카테고리의 다른 글
pytorch3d.io.IO 느린 로딩 속도 개선 방법 (0) | 2024.09.20 |
---|---|
Pytorch3d CUDA 12 이상에서 설치하기 (0) | 2024.09.13 |
python에서 yaml 다루기, PyYAML vs ruamel.yaml (0) | 2023.06.09 |
중복 파일 검사 후 삭제/이동/복사 (0) | 2023.03.16 |