파이썬으로 웹 API를 EXE화

소개



때때로 아래의 모든 것을 충족하고 싶다는 요청을받을 수 있습니다.
  • Python으로 만든 AI를 Windows 앱에 통합하고 싶습니다
  • AI 인터페이스를 웹 API로 만들고 싶습니다
  • 원격 서버와 통신하고 싶지 않습니다
  • 프로덕션 터미널에 파이썬을 설치하고 싶지 않습니다

  • 여러 가지 방법이 있다고 생각하지만,
  • AI 기능을 Python 웹 프레임 워크에서 웹 API로 게시 할 수있게하고
  • Python 스크립트를 EXE 파일로 변환하여 앱 본문과 함께 제공하고
  • 앱 본체에서 EXE를 실행하면 이것을 실현할 수 있습니다.

  • 이번에는 다음을 사용합니다.
  • OS: Windows 10
  • Python : 3.7.7 (개발 환경에만 설치)
  • 웹 프레임워크: Flask
  • EXE화: PyInstaller

  • (덧붙여서 FastAPI × uvicorn라면, 2020/3/30 시점에서는 문제가 있었습니다. htps : // 기주 b. 코 m / 핏 s t r / 핏 s t r / 푸 l / 4664 )

    절차



    Flask와 PyInstaller를 설치합니다.

    명령 프롬프트 등에서
    pip install flask pyinstaller
    

    웹 API를 게시하는 Python 파일을 만듭니다.

    main.py
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/predict')
    def predict():
      """
      AIによる予測を返すAPIのつもり
      """
      return {'result': 'Prediction by AI.'}
    
    if __name__ == '__main__':
      app.run()
    

    위 파일이 있는 디렉토리로 이동하여
    pyinstaller main.py --onefile
    
    dist 디렉토리에 main.exe 가 되어 있으므로, 시험에 실행해 봅니다.
    dist\main.exe
    
    Traceback (most recent call last):
      File "site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py", line 13, in <module>
      File "c:\users\user\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
        exec(bytecode, module.__dict__)
      File "site-packages\pkg_resources\__init__.py", line 86, in <module>
    ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
    [24508] Failed to execute script pyi_rth_pkgres
    

    위와 같이, ModuleNotFoundError 가 되는 경우는, main.py 와 같은 계층에 생성된 main.spec 파일을 텍스트 에디터로 편집합니다.
    구체적으로는 hiddenimports 에 없었던 모듈명을 포함합니다.

    main.spec
                 # -- 略 --
                 hiddenimports=[],
                 # -- 略 --
    

    ↓ 다음과 같이 수정하여 저장.

    main.spec
                 # -- 略 --
                 hiddenimports=['pkg_resources.py2_warn'],
                 # -- 略 --
    

    py 파일이 아닌 수정된 spec 파일을 지정하여 pyinstaller를 실행합니다.
    pyinstaller main.spec --onefile
    

    다시 동작 확인합니다.
    dist\main.exe
    

    방문해 보면 웹 API가 공개되었는지 확인할 수 있습니다.


    실제로 C# 등의 앱에서 이 EXE를 실행하고(요소 프로세스 관리), 친숙한 앱에서 Http 클라이언트로 액세스하게 됩니다.

    좋은 웹페이지 즐겨찾기