프로그래밍/Pycharm

파이썬 extension 모듈 Stub 파일 생성하기

바람냥냥 2023. 8. 26. 22:27
  • Pycharm은 python 개발에 참 좋은 도구입니다. vscode도 좋지만 python 개발 대부분은 pycharm을 이용하고 있습니다.
  • 전 주로 windows 개발환경에서 개발하고 있는데 windows환경에서 extesion 한 모듈(pyd)을 사용할 때 해당모듈의 정보를 제공해주 sutb를 생성하고 잘 동작하는지 테스트하는 과정을 포스팅해보고자 합니다.
  • mypy 사이트에서 stub는 다음과 같이 정의하고 있습니다
  • stub in python : A stub file is a file containing a skeleton of the public interface of that Python module, including classes, variables, functions – and most importantly, their types.*
  • 마치 c/c++ 에서 정의부를 c/cpp에 선언부를 h/hpp 파일에 관리하고 주요정보를 헤더파일을 통해 확인하는 것과 비슷한 맥락입니다
  • 이러한 stub파일을 생성하고 활용하는 방법은 저는 두가지를 활용하고 있고 이를 소개합니다.
    • pybind11_stubgen 패키지를 이용하고 직접 stub pyi 파일 생성
    • pip 를 이용하여 pycharm에서 관리하는 stub폴더에 생성(python_stubs)에 py파일 생성
  • 먼저 제가 진행해볼 extension 모듈은 callback관련 함수를 pybind11을 이용하여 extension한 mycallback 이란 모듈입니다.
  • 먼저 다음과 같이 정상적으로 모듈이 import되고 help함수를 출력한 결과입니다.

* 이제 다음 코드를 통해 pyi를 생성해보겠습니다.

# generate_stub.py
from pybind11_stubgen import ModuleStubsGenerator
# https://github.com/robotpy/robotpy-build/issues/1
import mycallback

def generate():
    module = ModuleStubsGenerator(mycallback)
    module.parse()
    # stubgen.generate_stubs(res)

    module.write_setup_py = False

    init_pyi = "mycallback.pyi"
    with open(init_pyi, "w") as fp:
        fp.write("#\n# AUTOMATICALLY GENERATED FILE, DO NOT EDIT!\n#\n\n")
        fp.write("\n".join(module.to_lines()))

    print("generate stub files :{}".format(init_pyi))

generate()
  • pybind11_stubgen을 이용해서 다음 이미지처럼 stub파일을 생성할수 있습니다.

  • 이제 정상적으로 테스트를 해봅니다. 모듈이름과 동일한 이름의 pyi파일을 생성하면 extension한 모듈도 다음 이미지처럼 미리보기가 됩니다.

  • 두번째 방법은 더욱더 간단합니다.
  • pip 명령을 이용하면 해당 경로에 있는 extension 모듈의 stub파일을 pythcarm의 stub폴더에 저장해줍니다.
...pybind_test>python -m pip install ./   
  • 위와 같이 명령하면 stub파일이 "AppData\Local\JetBrains\Pycharm~~\python_stubs\프로젝트관리번호?" 에 저장되는걸로 확인됩니다. 마찬가지로 해당 모듈을 import해보면 잘 동작하는것을 확인할 수 있습니다.
  • 아직 포스팅이 서툴러서 이정도로 마무리하도록 하겠습니다. 궁금한점 있으시면 댓글로 문의 주세요~