파이썬의 if __name__ == "__main__": 구문
파이썬에서 if __name__ == "__main__": 구문은 스크립트가 직접 실행될 때와 모듈로 임포트될 때의 동작을 구분하기 위해 사용됩니다. 스크립트가 직접 실행될 때 __name__ 변수는 "__main__"으로 설정되며, 모듈로 임포트될 때는 모듈의 이름이 __name__ 변수에 할당됩니다. 이를 통해 스크립트가 직접 실행될 때만 특정 코드가 실행되도록 할 수 있습니다.
예시 코드 설명
다음은 Flask 서버를 실행하는 예시 코드입니다:
from flask import Flask, jsonify, request
import tensorflow as tf
import PIL.Image as image
app = Flask(__name__)
def work(img, model):
pred = model.predict(img)
pred = pred
idx = tf.math.argmax(pred)
return idx
@app.route("/", methods=["GET"])
def predict():
imgurl = request.args.get("img")
result_string = "please input image url"
if imgurl is not None:
imgurl = imgurl.split("?")
img = image.open("img/" + imgurl)
img = tf.keras.utils.img_to_array(img)
img = tf.expand_dims(img, axis=0)
idx = work(img, model)
result_string = f"This number is {idx}"
return jsonify(result_string)
if __name__ == "__main__":
model = tf.keras.models.load_model("mymodel")
app.run(host="0.0.0.0", port=8080)
이 코드에서 if __name__ == "__main__": 구문은 스크립트가 직접 실행될 때만 Flask 서버를 시작하도록 합니다. 이를 통해 다른 프로젝트에서 이 스크립트를 모듈로 임포트하여 사용할 때, 불필요하게 Flask 서버가 실행되는 것을 방지할 수 있습니다.
코드의 유용성
이러한 구조는 여러 가지 이유로 유용합니다:
- 재사용성: 다른 프로젝트에서 이 스크립트를 모듈로 임포트하여 사용할 수 있습니다. 예를 들어, 이미지 처리 함수 work를 다른 프로젝트에서 재사용할 수 있습니다.
- 테스트 용이성: 개별 함수나 클래스를 독립적으로 테스트하거나 디버깅할 수 있습니다. Flask 서버가 실행되지 않으므로 테스트 환경을 더 쉽게 설정할 수 있습니다.
- 코드 분리: 스크립트의 실행 부분과 로직 부분을 분리하여 코드의 가독성과 유지보수성을 높일 수 있습니다.
예시 사용법
다른 스크립트에서 flask_practice.py 파일을 임포트하여 work 함수를 사용하는 예시입니다:
from flask_practice import work
import tensorflow as tf
import PIL.Image as image
model = tf.keras.models.load_model("mymodel")
img = image.open("path/to/image.jpg")
img = tf.keras.utils.img_to_array(img)
img = tf.expand_dims(img, axis=0)
result = work(img, model)
print(f"Predicted index: {result}")
이렇게 하면 Flask 서버를 실행하지 않고도 work 함수를 사용할 수 있어 코드의 재사용성과 유연성이 높아집니다.
데코레이터의 역할
@ 마크는 파이썬에서 데코레이터를 나타내는 데 사용됩니다. 데코레이터는 함수나 메서드의 동작을 수정하거나 확장하는 데 사용되는 특별한 함수입니다. 데코레이터는 다른 함수를 감싸서 추가적인 기능을 제공할 수 있습니다.
예시
def my_decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
위 예시에서 @my_decorator는 say_hello 함수를 감싸서 추가적인 기능을 제공합니다. say_hello 함수를 호출하면 데코레이터가 먼저 실행되어 추가적인 메시지를 출력합니다.
Flask에서의 사용
Flask에서는 데코레이터를 사용하여 라우트를 정의합니다. 예를 들어, @app.route("/")는 특정 URL 경로에 대한 요청을 처리할 함수를 지정합니다.
@app.route("/", methods=["GET"])
def home():
return "Welcome to the home page!"
이렇게 하면 클라이언트가 / 경로로 GET 요청을 보낼 때 home 함수가 호출됩니다.
GET 요청과 쿼리 매개변수
GET 요청은 클라이언트가 서버로부터 데이터를 요청하는 HTTP 메서드입니다. 쿼리 매개변수는 URL에 추가 정보를 전달하기 위해 사용되는 부분입니다. 보통 ? 뒤에 키=값 형태로 붙습니다.
예시
- 기본 URL: http://localhost:8080/
- 쿼리 매개변수 추가: http://localhost:8080/?img=example.jpg
여기서 img=example.jpg가 쿼리 매개변수입니다. 이 매개변수를 통해 서버에 추가 정보를 전달할 수 있습니다.
Flask에서의 사용
@app.route("/", methods=["GET"])
def predict():
imgurl = request.args.get("img") # URL에서 'img' 매개변수의 값을 가져옴
result_string = "please input image url"
if imgurl is not None:
imgurl = imgurl.split("?")
img = image.open("img/" + imgurl)
img = tf.keras.utils.img_to_array(img)
img = tf.expand_dims(img, axis=0)
idx = work(img, model)
result_string = f"This number is {idx}"
return jsonify(result_string)
동작 방식
- URL 입력: http://localhost:8080/?img=example.jpg를 입력합니다.
- GET 요청: 브라우저가 이 URL로 GET 요청을 보냅니다.
- 쿼리 매개변수 처리: Flask는 request.args.get("img")를 사용해 img 매개변수의 값을 가져옵니다.
- 이미지 처리: 가져온 값을 사용해 이미지를 로드하고 예측을 수행합니다.
- 응답 반환: 예측 결과를 JSON 형식으로 반환합니다.
'데이터 분석' 카테고리의 다른 글
streamlit 기본 기능 연습 (3) | 2024.10.06 |
---|---|
정규표현식 (0) | 2024.10.04 |
클러스터링(군집화) 타당성 평가 (0) | 2024.09.14 |
wine 데이터셋을 활용한 혼동행렬 시각화 (0) | 2024.09.14 |
객체지향 프로그래밍 (3) | 2024.09.10 |