#-*- coding:utf-8 -*-
import ssl
import sys, getopt
from flask import Flask, request
....
def setInstance(argv):
FILE_NAME = argv[0]
INSTANCE_NAME = ""
try:
opts, etc_args = getopt.getopt(argv[1:], "hi:", ["help", "instance="])
except getopt.GetoptError:
print(FILE_NAME, '-i <instance name>')
sys.exit(2)
for opt, arg in opts:
if opt in ("-h", "--help"):
print(FILE_NAME, '-i <instance name>')
sys.exit()
elif opt in ("-i", "--instance"):
INSTANCE_NAME = arg
if len(INSTANCE_NAME) < 1:
INSTANCE_NAME = "wd"
print("INSTANCE_NAME : ", INSTANCE_NAME)
if INSTANCE_NAME == "wd":
app.static_folder = os.path.join(ROOT_PATH, 'dist2')
elif INSTANCE_NAME == "order":
app.static_folder = os.path.join(ROOT_PATH, 'dist1')
if __name__ == '__main__':
#ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
#ssl_context.load_cert_chain(certfile='private.crt', keyfile='private.key' , password='')
#app.run(host="0.0.0.0", port=443, ssl_context=ssl_context)
setInstance(sys.argv)
app.run(port=8080, debug=True)
#app.run(host="0.0.0.0", port=80, debug=True)
"python 소스코드이름" 명령어를 통해 파이썬 코드를 실행할 수 있다.
명령어 실행시점마다 다른 옵션을 주고 싶은 경우 Command Line Arguments를 이용할 수 있다.
기대되는 결과부터 살펴보고 소스코드를 살펴보자
myapp.py라는 소스코드가 있고 해당 소스코드는 인스턴스명과 채널명을 입력받는다
인스턴스명은 필수이고 채널명은 옵션이라고 가정한다
Short방식(ex. -i) 또는 Long방식(--instance)으로 입력받을 수 있다
잘 모르는 경우 -h 또는 --help 옵션을 통해 사용법을 조회할 수 있다.
# python myapp.py -h 또는 # python myapp.py --help [결과] myapp.py -i <instance name> -c <channel name>
[필수 옵션인 인스턴스명을 입력하지 않은 경우]
# python myapp.py 또는 # python myapp.py -c CHAN1 [결과] myapp.py -i option is mandatory
[필수인 인스턴스명을 올바르게 입력한 경우]
# python myapp.py -i INS1 또는 # python myapp.py -iINS1 또는 # python myapp.py --instance=INS1 또는 # python myapp.py --instance INS1 [결과] INSTANCE_NAME: INS1 CHANNEL_NAME:
[인스턴스명과 채널을 입력한 경우]
# python myapp.py -c CHAN1 -i INS1 또는 # python myapp.py --channel=CHAN1 --instance=INS1 또는 # python myapp.py --channel CHAN1 --instance INS1 [결과] INSTANCE_NAME: INS1 CHANNEL_NAME: CHAN1
[등록되지 않은 옵션을 입력한 경우]
# python myapp.py -j=INS1 [결과] myapp.py -i <instance name> -c <channel name>
위 요건을 만족하는 프로그램을 작성해보자
시작하기 앞서 getopt()함수의 이해가 요구된다
아래 소스 중 "hi:c:"의 의미는 -h, -i값, -c값 을 기대한다는 의미이다
알파벳 뒤 :기호의 의미는 뒤에 값을 기대한다는 의미다
순서를 섞어서 "c:i:h"와 같이 기입해도 결과는 같다
그리고 3번째 파라미터의 ["help","instance=","channel="]의 의미는
help는 옵션만 --help 이런식으로 입력을 받는다. 뒤에 값은 기대하지 않는다
이름 뒤에 =기호가 있는 instance와 channel은 뒤에 값을 기대한다는 의미이다
즉 --instance=값, --channel=값 또는 --instance 값, --channel 값 등의 형태로 입력을 요구한다
getopt — C-style parser for command line options — Python 3.7.1 documentation
getopt — C-style parser for command line options Source code: Lib/getopt.py Note The getopt module is a parser for command line options whose API is designed to be familiar to users of the C getopt() function. Users who are unfamiliar with the C getopt() function or who would like to write les
docs.python.org
마지막으로 주의할 점은 C언어에서 활용하는 타입의 규칙이다.
- 두개와 - 한개 그리고 - 옵션에 =를 사용하면 어떤 부작용이 생기는지 눈으로 확인해보자
# python myapp.py -instance=INS1 [결과 주의!!!] INSTANCE_NAME: nstance=INS1 CHANNEL_NAME: # python myapp.py -i=INS1 [결과 주의!!!] INSTANCE_NAME: =INS1
[전체 소스 코드]
import sys, getopt def main(argv): FILE_NAME = argv[0] # command line arguments의 첫번째는 파일명 INSTANCE_NAME = "" # 인스턴스명 초기화 CHANNEL_NAME = "" # 채널명 초기화 try: # opts: getopt 옵션에 따라 파싱 ex) [('-i', 'myinstancce1')] # etc_args: getopt 옵션 이외에 입력된 일반 Argument # argv 첫번째(index:0)는 파일명, 두번째(index:1)부터 Arguments opts, etc_args = getopt.getopt(argv[1:], \ "hi:c:", ["help","instance=","channel="]) except getopt.GetoptError: # 옵션지정이 올바르지 않은 경우 print(FILE_NAME, '-i <instance name> -c <channel name>') sys.exit(2) for opt, arg in opts: # 옵션이 파싱된 경우 if opt in ("-h", "--help"): # HELP 요청인 경우 사용법 출력 print(FILE_NAME, '-i <instance name> -c <channel name>') sys.exit() elif opt in ("-i", "--instance"): # 인스턴명 입력인 경우 INSTANCE_NAME = arg elif opt in ("-c", "--channel"): # 채널명 입력인 경우 CHANNEL_NAME = arg if len(INSTANCE_NAME) < 1: # 필수항목 값이 비어있다면 print(FILE_NAME, "-i option is mandatory") # 필수임을 출력 sys.exit(2) print("INSTANCE_NAME:", INSTANCE_NAME) print("CHANNEL_NAME:", CHANNEL_NAME) # module이 아닌 main으로 실행된 경우 실행된다 if __name__ == "__main__": main(sys.argv)
끝.