Post

(python) argparse, python-fire

argparse(docs)

원래 파이썬에서 프로그램 실행 시 인자( e.g., main(int argc, char \*argv[]) )를 받기 위해서는 sys모듈의 sys.argv를 이용해야 한다.

1
2
args = sys.argv[1:]

이를 대체하는 argv 파싱 라이브러리로 argparse를 사용하면 더 편하다. (optparse는 업데이트가 중단되어 argparse에 포함 되었다.) sys.argv사용할 필요 없이 python argparser.parse\_args() 하는 순간 알아서 argument를 가져온다.

1
2
3
4
5
6
7
8
argparser = argparse.ArgumentParser(description='tistory downloader')
argparser.add\_argument('-nomedia', action='store\_true', help="...")
argparser.add\_argument('-md', action='store\_true', help="...")
argparser.add\_argument('--src', default="./{postname}\_files/", help="...")
argparser.add\_argument('-b', action='store\_true', help="...")
argparser.add\_argument('url', type=str, help='...')
argv = argparser.parse\_args()

argv 객체를 출력해 보면 이렇다.

1
2
Namespace(h2md=False, m=True, url='asdf')

action='store\_const'를 지정해 숫자 값을 갖도록 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def parseArgs():
parser = argparse.ArgumentParser(description="SIEM Mimikatz detect python application.")
parser.add\_argument("arg", metavar="<type>:<\*.dll>:<\*.dll>:<...>", type=str, nargs='+', help="e.g., Rule:ntdll.dll:cryptsp.dll")
return parser.parse\_args()

  

if \_\_name\_\_ == "\_\_main\_\_":
dll\_list = parseArgs()
print(dll\_list)
>>> Namespace(arg=['Rule:cryptsp.dll'])
>>> python .\query.py -h
>>> positional arguments:
>>>   <type>:<\*.dll>:<\*.dll>:<...>                     e.g., Rule:ntdll.dll:cryptsp.dll

positional argument를 명시해도되고 안해도 되도록 만들고 싶은 경우
1
2
parser.add\_argument("addr", type=str, nargs="?", help="RAPT Server address e.g., 192.168.0.1:31234")

python-fire

https://github.com/google/python-fire

This post is licensed under CC BY 4.0 by the author.