애니리뷰

python - argparse에 대해

두원공대88학번뚜뚜 2022. 11. 4. 16:28

[Python] argparse 사용법, 예제 (tistory.com)

 

[Python] argparse 사용법, 예제

Argument 란? argparse는 Python Script 실행 시 하나의 Script의 동작을 여러가지 상황에 따라 다르게 동작하도록 할 때 쓰인다. 다른 동작을 만들어 내기 위해 Script 실행 시 Argument를 붙여서 원하는 옵션을

goez.tistory.com

해당 에러가 발생했고,  

opt.data, opt.cfg, opt.hyp = check_file(opt.data), check_file(opt.cfg), check_file(opt.hyp)  # check files

위의 명령어에서 문제가 발생됨.

그리고  

opt = parser.parse_args()

이것이 opt의 정체로 보이는데, 그러려면 parser가 뭔질 알아야 할 것 같음.

parser = argparse.ArgumentParser()

main함수 시작하자마자 바로 이게 나와 있어서, argparse에 대해 알아야 할 필요성 느낌.

근데 후딱 끝내야 하는 일이라 금방금방 써서 속성으로 익힐 예정....이어야 됨.

 

argparse : 파이썬 Script 실행 시, 하나의 Script 동작을 여러 상황에 따라 다르게 동작하도록 할 때 쓰인다고 함.

이 때 Argument란, 위의 a나 -r같은 거임. 하나의 프로그램을 상황에 따라 옵션을 변경해서 원하는 동작을 수행토록 하는 것. 이는 이미 많이 써온 것이다, 그 명칭을 몰랐을 뿐, int main(int argc char **argv) 의 argc(argument를 몇 개?)와 argv(그 argument 내용)인 거임.

 

그리고 파이썬에서는 이 Argument를 받아오기 위해서는, ArgumentParser을 이용해 Instance를 만드는 과정을 거쳐야 한다.

# ArgumentParser 객체 
parser = argparse.ArgumentParser(description='Argument 설명 입니다')

# Argument 추가
parser.add_argument('-VehNum', type=int,
                    help='-VehNum 1234: 1st Car, 4567: 2nd Car')

args = parser.parse_args() #입력 Argument들을 args에 할당

위는 예제고, 실제로 yolo face에서는

parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='', help='initial weights path')
parser.add_argument('--cfg', type=str, default='cfg/yolov7-tiny-pose.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default='data/widerface.yaml', help='data.yaml path')
parser.add_argument('--hyp', type=str, default='data/hyp.face.yaml', help='hyperparameters path')
...
opt = parser.parse_args()

처럼 add_argument을 여러 번 사용하는 걸 볼 수 있음.

description을 통해 대략적인 argument 내용을 적을 수 있으며, Help Mode시 표시된다고 함.

위의 예제를 보면, -VehNum을 Attribute(차량번호)로, Attribute의 Type type=int로, Help Mode 시 보여줄 설명 help='설명' 으로 정의 하였다.

 

마지막으로 args = parser.parse_args() 구문을 이용해 Argument Value를 args에 저장 하였다. 여기까지 작성하면 입력 Argumet 값을 전부 받아오게 된다. 

 

cmd 창을 통해 아래와 같이 명령 할 경우 args에 Argument 값이 저장 된다.

PyArg -VehNum=1234 # 차량번호 1234 인 차 정보 알려줘!

위와 같이 명령을 할 경우 args에 있는 Argument 값 = 1234는 args.VehNum에 저장되어 있어 쉽게 사용 가능하다고 한다.

이제 Argument에 따라 차량 정보를 표시해주면 된다는데, 이 차량 정보를 표시하는 code를 아래처럼 정의하고

def showVehSpec(vehNum):
    # 사용자가 선택한 차종에 따라서 차량 스펙을 보여줘!
    if (vehNum == 1234):
        Address = '1호'
        CellPhone = '010-1234-5678'
        HostName  = 'Jhone'

    elif vehNum == 4567:
        Address = '2호'
        CellPhone = '010-5678-1234'
        HostName  = 'Smith'
    print('Vehicle Address: ', Address)
    print('Vehicle CellPhone: ', CellPhone)
    print('Vehicle HostName ', HostName)

 main에서 위의 함수를 호출하면

arser = argparse.ArgumentParser(description='Argument 설명 입니다')

parser.add_argument('-VehNum', type=int,
                    help='-VehNum 1234: 1st Car, 4567: 2nd Car')
args = parser.parse_args()


showVehSpec(args.VehNum)

실행을 하면 위와 같이 뜬다고 한다.

순서대로 설명하면,

1) parser라는 Argument parser을 만듦.

2) -vehNum이라는 Argument를 추가한다. 이는 type int를 받을 수 있다.

3) 이렇게 만들어낸 parser는 parse_args()를 통해 하나로 합침(실제 예 참조). 

4) 만약 -vehNum = 1234를 대입시, showVehSpec(args.VehNum)에는 1234가 넘어가게 됨. 

4-1) 이 때 주의할 점은, parser은 '-VehNum'이라 했음에도, 알아서 컴파일러가 ''와 -를 제거하여 인식한다는 점이다.

5) 그럼 showVehSpec 함수는 1234를 인식하고 해당 if절로 넘어가게 됨.

 

이를 바탕으로, 맨 위의 에러가 어째서 발생했는지 추측이 가능하다.

parser.add_argument('--cfg', type=str, default='cfg/yolov7-tiny-pose.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default='data/widerface.yaml', help='data.yaml path')
parser.add_argument('--hyp', type=str, default='data/hyp.face.yaml', help='hyperparameters path')

yolo7face는 다음과 같은 argument를 갖는다. 근데 이 file을 찾을 수 없다고 뜬다.

즉, 각 default의 파일들을 못 찾고 있다는 의미임. 그렇다면 이를 default에 적힌 디렉토리에 넣거나, 혹은 이 파일들이 있는 디렉토리로 default를 수정해주는 작업이 필요할 것.