데이터 분석을 하시는 분들은 jupyter notebook이라는 키워드가 익숙하실 겁니다. Django 또는 Flask로 웹 개발을 하시는 분들은 django-admin startproject, flask run과 같은 명령어를 많이 쳐보셨을 겁니다. 파이썬으로 이런 명령어 프로그램은 어떻게 만드는 걸까요? 오늘은 파이썬으로 커맨드 라인 프로그램을 만드는 법을 알아보겠습니다.


argparse 모듈

먼저 파이썬 표준 라이브러리에서 제공하는 모듈인 argparse에 대해 알아보겠습니다.

우선 다음과 같이 hello 폴더에 똑같은 hello 폴더를 만들고 안에 __init__.py파일과 main.py파일을 만들어줍니다.

main.py에는 다음과 같이 입력합니다.

# hello/main.py
# argparse 모듈 임포트
import argparse


def hello(name):
    print("Hello, {}".format(name))


def main():
    parser = argparse.ArgumentParser()
    # name argument 추가
    parser.add_argument('name')
    args = parser.parse_args()

    name = args.name
    hello(name)


if __name__ == "__main__":
    main()

위와같은 코드를 짠 다음 커맨드창에서 python main.py SJQuant라고 입력해봅시다.

$ python main.py SJQuant

아래와 같은 결과가 나올것입니다.

>> Hello, SJQuant

기본적으로 --help 옵션 또한 제공해줍니다.

$ python main.py --help

>> 
usage: main.py [-h] name

positional arguments:
  name

optional arguments:
  -h, --help  show this help message and exit

(click_tutorial)  E:\dev\python-cli\ex1>python main.py --help
usage: main.py [-h] name

positional arguments:
  name

optional arguments:
  -h, --help  show this help message and exit

add_argument메소드에 help 키워드 인자를 넣으면 설명을 추가할 수 있습니다.

...
parser.add_argument('name', help="Write name you want to say Hello.")
...
$ python main.py --help
>> 
...
positional arguments:
  name        Write name you want to say Hello.
...

이 외에도 다양한 옵션을 추가할 수 있습니다.

import argparse
import sys


def hello(name):
    print("Hello, {}".format(name))


def bye(name):
    print('Good bye, {}'.format(name))


def main():
    parser = argparse.ArgumentParser()

    # nargs: arguments의 수
    # ? -> arg가 없으면 default값으로
    parser.add_argument(
        'name', nargs='?', default=False, help="Write name you want to say Hello.")

    # 버전확인 옵션추가
    # action: 해당 argument가 추가될 때 일어나는 액션 (여기서는 version을 true로)
    parser.add_argument('-v', '--version', action="store_true",
                        help="Show version of this program")

    # 둘 중 하나만 사용할 수 있는 옵션
    # --hello 또는 --bye 둘 중 하나만을 사용할 수 있음
    group = parser.add_mutually_exclusive_group()
    group.add_argument('--hello', action="store_true", help="say hello")
    group.add_argument('--bye', action="store_true", help="say good bye")

    args = parser.parse_args()

    name = args.name

    if args.version:
        print('1.0.0')
        sys.exit()

    if not name:
        parser.print_help()
        sys.exit()

    # bye 옵션이 있다면
    # say goodbye
    if args.bye:
        bye(name)
    else:
        hello(name)


if __name__ == "__main__":
    main()
$ python main.py --version

>> 1.0.0
$ python main.py SJQuant --hello

>> Hello, SJQuant
$ python main.py SJQuant --bye

>> Good bye, SJQuant

setup.py 정의

하지만 아직 명령어 프로그램을 사용하기 위해서는 해당 폴더에 가서 python main.py라는 명령어를 입력해주어야 합니다. hello sjquant와 같이 사용하기 위해서는 setup.py파일을 작성하고 설치해주어야 합니다.

main.py의 상위 폴더와 동등한 위치(사진참고)에 setup.py파일을 만들고 다음과 같이 입력해줍니다.

from setuptools import setup, find_packages

setup(
    # 모듈명
    name='hello',
    # 버전
    version='1.0.0',
    author='SJQuant',
    author_email='seonujang92@gmail.com',
    description='Greet someone',
    packages=find_packages(),
    # 여기가 중요합니다.
    entry_points={
        "console_scripts": [
          # hello라는 명령어를 실행하면
          # hello모듈 main.py에서 main함수를 실행한다는 의미입니다.
            "hello = hello.main:main"
        ]
    },
    classifiers=[
        'Programming Language :: Python :: 3',
        'License :: OSI Approved :: MIT License',
        'Operating System :: OS Independent',
    ],
)

그런 다음 setup.py파일이 있는 경로에서 다음 명령어를 실행해주면 모듈 설치가 진행됩니다. (주의할 점: 가상환경에서 설치를 진행하면 해당 명령어 또한 설치한 가상환경에서만 사용할 수 있습니다. 전역에서 사용하고 싶다면 루트 파이썬이 있는 폴더에 설치해야 합니다.)

$ python setup.py install

이제 hello명령어를 커맨드라인에서 사용할 수 있습니다.

$ hello --help

>> 
usage: hello [-h] [-v] [--hello | --bye] [name]

positional arguments:
  name           Write name you want to say Hello.

optional arguments:
  -h, --help     show this help message and exit
  -v, --version  Show version of this program
  --hello        say hello
  --bye          say good bye
$ hello sjquant --hello
>> Hello, sjquant

$ hello sjquant --bye
>> Good bye, sjquant

더 공부하기

파이썬 공식문서를 확인하면 argparse의 다양한 옵션과 사용법을 보실 수 있습니다. 또한, 웹에서 영상 또는 이미지같은 미디어를 스크래핑하는 커맨드라인 프로그램 you-getcommon.py (클릭)를 살펴보는 것도 실제 argparse의 활용법을 익히는데 많은 도움이 될 거 같습니다. (커맨드 라인과 관계없는 코드들도 나오니 argparse를 검색하셔서 보는 것을 권장합니다.)


click

argparse뿐만이 아니라 click모듈도 많이 사용됩니다. click모듈은 argparse에서 제공하는 기능을 보다 쉽고, decorator를 사용해 보다 깔끔하게 사용할 수 있게 해줍니다. Flask에서 CLI(Command Line Interface)를 구현하기 위해 사용한 모듈이기도 합니다. click에 대한 설명은 2편에서 다루도록 하겠습니다.

2편 보러가기