Python 애플리케이션 구조화

9360 단어
원문 : https://brainsorting.dev/posts/structuring-a-python-application/

이 짧은 기사에서는 빠른 스크립트에서 더 복잡한 웹 응용 프로그램에 이르기까지 Python 응용 프로그램을 구성하는 모든 다양한 방법을 설명합니다.

모든 코드를 포함하는 단일 파이썬 파일



종속성이 없는 코드나 가상 환경을 사용하는 경우에는 괜찮습니다. 이것은 일반적으로 파일 구조에 복잡성이 필요하지 않은 빠른 스크립트에 사용됩니다.


my-single-file-project/
├── .gitignore
├── helloworld.py
├── test.py
├── pyproject.toml
├── LICENSE
└── README.md

helloworld.py의 예:

#!/usr/bin/env python
# helloworld.py

from datetime import datetime

def do_hello():
    print(f"Hello, today is {datetime.now().date()}")

if __name__ == '__main__':
    do_hello()


설치 가능한 단일 패키지



앱이 더 복잡해지면 일반적으로 다른 파일과 도우미를 모듈로 그룹화하려고 합니다.

또한 모든 파일 → 테스트 범위를 포함하도록 테스트를 개선해야 합니다. 린터의 사용을 추가할 수도 있습니다.

my-single-package-app/
├── helloworld/
│   ├── __init__.py
│   ├── helloworld.py
│   └── utils.py
├── tests/
│   ├── __init__.py
│   ├── test_helloworld.py
│   └── test_utils.py
├── runtest.sh
├── .gitignore
├── pyproject.toml
├── LICENSE
└── README.md


이제 앱의 파일을 helloworld 앱 폴더와 tests 폴더의 두 폴더에 그룹화했습니다.
test_****.py 파일 이름을 앱 모듈 폴더의 파일과 일치시킵니다.
__init__.py 파일은 파이썬이 그것이 패키지이고 비어 있을 수 있음을 알기 위해 필수입니다.

#!/usr/bin/env python
# helloworld.py

from datetime import datetime

from helloworld.utils import show_message

def do_hello():
    show_message(f"Hello, today is {datetime.now().date()}")

if __name__ == '__main__':
    do_hello() # pragma: no cover

runtests.sh 파일은 coverage로 설치할 수 있는 poetry add coverage -D 종속성을 사용하여 모든 테스트를 실행하는 스크립트입니다.

#!/bin/bash

find . -name "*.pyc" -exec rm {} \;
coverage run -p --source=tests,helloworld -m unittest # this is where you add the
                                                      # folders you want to test
if [ "$?" = "0" ]; then
    coverage combine
    echo -e "\n\n================================================"
    echo "Test Coverage"
    coverage report
    echo -e "\nrun \"coverage html\" for full report"
    echo -e "\n"

    # pyflakes or its like should go here
fi


내부 패키지가 있는 애플리케이션



더 큰 앱에서는 특히 GUI를 수행하는 경우 여러 모듈이 있을 것입니다.

응용 프로그램에 추가할 수 있는 항목은 다음과 같습니다.
  • bin 디렉토리, 진입점 래퍼.
  • 데이터 디렉토리, 항상 코드에서 데이터를 분리하십시오.

  • app/
    ├── helloworld/
    │   ├── __init__.py
    │   ├── hello/
    │   │   ├── __init__.py
    │   │   ├── hello.py
    │   │   └── utils.py
    │   ├── world/
    │   │   ├── __init__.py
    │   │   └── world.py
    ├── tests/
    │   ├── __init__.py
    │   ├── hello/
    │   │   ├── __init__.py
    │   │   ├── test_hello.py
    │   │   └── test_utils.py
    │   ├── world/
    │   │   ├── __init__.py
    │   │   └── test_world.py
    ├── bin/
    │   └── helloworld*
    ├── data/
    │   └── translate.csv
    ├── docs/
    │   ├── conf.py
    │   ├── index.rst
    │   ├── hello.rst
    │   ├── world.rst
    │   └── Makefile
    ├── runtest.sh
    ├── .gitignore
    ├── pyproject.toml
    ├── LICENSE
    └── README.md
    


    큰 상자/



    이 새 폴더에는 사용자가 사용할 모든 실행 파일이 들어 있습니다. 스크립트는 .py 엔딩을 삭제합니다. 코드 논리가 거의 없어야 하며 기본 모듈의 진입점에 대한 래퍼일 뿐입니다.

    휠을 빌드하는 경우 이를 패키징하도록 구성할 수 있습니다setup.py. 스크립트는 경로에 배치됩니다.

    데이터/



    코드가 아닌 파일이 있는 경우 일반적으로 파일이 끝나는 위치에 있어야 합니다. 테스트 데이터에도 유용합니다.

    문서/



    사용자와 앱을 공유하려면 문서가 매우 중요합니다.

    이에 대한 매우 유용한 라이브러리는 sphinx 이며 pydoc 주석을 사용하여 문서를 자동으로 빌드합니다.

    poetry add sphinx -D
    poetry add sphinx-rtd-theme -D
    cd docs
    sphinx-quickstarts
    make html
    

    .rst 파일은 sphinx-quickstart 에 의해 생성됩니다.

    장고 웹 애플리케이션



    설치한 후Django 이 포함된 명령을 사용하여 Django가 예상하는 대로 프로젝트 아키텍처를 생성할 수 있습니다.

    django-admin startproject django_world
    django-admin startapp hello
    


    몇 가지 항목이 수동으로 추가된 이 기본 폴더 트리로 끝납니다.

    django_world/
    ├── docs/
    ├── static/
    │   └── style.css
    ├── templates/
    │   └── base.html
    ├── resetdb.sh
    ├── runserver.sh
    ├── hello/
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations/
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── django_world/
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py
    

    hello/ 폴더는 모든 로직, 모델, 뷰 등이 존재하는 곳입니다.
    static 폴더에는 모든 정적 컨텐츠(css, js,...)가 포함되어 있습니다.
    templates 폴더에는 모든 html 템플릿이 있습니다.
    runserver.sh는 한 줄만 있는 스크립트입니다.

    python manage.py runserver
    

    resetdb.sh는 모든 데이터베이스를 지우고 처음부터 시작하기 위한 스크립트이며 도우미 도구일 뿐입니다.

    #!/bin/bash
    
    find . -name "*.pyc" -exec rm {} \;
    rm db.sqlite3
    
    python manage.py migrate
    
    # python manage.py create_test_data
    # comment that last line to use premade test data
    


    플라스크



    Flask는 10줄의 코드로 작동하는 웹 앱을 보여주는 것을 자랑스럽게 생각하지만 실제로는 그렇게 하지 않을 것입니다. 다음은 완전한 폴더 구성입니다.

    flaskr/
    │
    ├── flaskr/
    │   ├── ___init__.py
    │   ├── db.py
    │   ├── schema.sql
    │   ├── auth.py
    │   ├── blog.py
    │   ├── templates/
    │   │   ├── base.html
    │   │   ├── auth/
    │   │   │   ├── login.html
    │   │   │   └── register.html
    │   │   │
    │   │   └── blog/
    │   │       ├── create.html
    │   │       ├── index.html
    │   │       └── update.html
    │   │
    │   └── static/
    │       └── style.css
    │
    ├── tests/
    │   ├── conftest.py
    │   ├── data.sql
    │   ├── test_factory.py
    │   ├── test_db.py
    │   ├── test_auth.py
    │   └── test_blog.py
    │
    ├── .gitignore
    └── MANIFEST.in
    


    우리는 플라스크가 실제로 파이썬 패키지 작업 방식을 사용한다는 것을 알 수 있습니다.

    출처 : https://realpython.com/python-application-layouts/

    좋은 웹페이지 즐겨찾기