Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Python 도구

componentize-py로 컴포넌트 빌드하기

componentize-py는 Python 애플리케이션을 WebAssembly 컴포넌트로 변환하는 도구입니다.

먼저 Python 3.10 이상과 pip이 아직 설치되어 있지 않다면 설치하십시오. 그런 다음 componentize-py를 설치하십시오:

pip install componentize-py

다음으로, 대상으로 삼을 WIT 월드를 생성하거나 다운로드하십시오. 이 예제에서는 add 함수가 있는 adder 월드를 사용합니다.

package docs:adder@0.1.0;

interface add {
    add: func(x: u32, y: u32) -> u32;
}

world adder {
    export add;
}

프로젝트용 새 디렉터리를 만들고 그 안에 wit라는 하위 디렉터리를 만드십시오. 이 코드를 복사하여 wit/component.wit라는 파일에 붙여 넣으십시오.

(IDE나 타입 검사기를 위해) WIT 월드에 대한 바인딩을 생성하려면 bindings 하위 명령을 사용하여 생성할 수 있습니다. 대상으로 하는 월드가 포함된 WIT 인터페이스의 경로를 지정하십시오:

componentize-py --wit-path wit --world adder bindings .

Note

다음 단계에서 componentize를 실행하기 위해 바인딩을 미리 생성할 필요는 없습니다. componentize는 바인딩을 즉석에서 생성하여 결과로 만들어지는 컴포넌트에 함께 번들링합니다.

바인딩 생성을 두 번 실행하려고 하면, bindings 폴더가 이미 존재하는 경우 실패합니다.

바인딩은 기본적으로 wit_world라는 폴더에 생성됩니다:

<project folder>
├── wit
│   └── component.wit
└── wit_world
    ├── exports
    │   ├── add.py
    │   └── __init__.py
    ├── __init__.py
    └── types.py

wit_world/exports 폴더에는 우리가 구현할 수 있는 add 메서드를 가진 Add 프로토콜이 들어 있으며, 이는 adder 월드 WIT에 정의된 익스포트를 나타냅니다.

adder 월드(특히 익스포트되는 add 인터페이스)를 구현하려면 다음 코드를 app.py라는 파일에 넣으십시오:

from wit_world import exports

class Add(exports.Add):
    def add(self, x: int, y: int) -> int:
        return x + y

이제 componentize 하위 명령을 사용하여 애플리케이션을 WebAssembly 컴포넌트로 컴파일할 수 있습니다:

componentize-py \
    --wit-path wit/component.wit \
    --world adder \
    componentize \
    app \
    -o add.wasm
Component built successfully

예제 호스트에서 컴포넌트 실행하기

다음 섹션을 진행하려면 Rust 툴체인이 설치되어 있어야 합니다.

이 저장소에는 adder 월드를 구현하는 컴포넌트를 실행할 수 있는, Rust로 작성된 WebAssembly 호스트 예제가 포함되어 있습니다.

  1. git clone https://github.com/bytecodealliance/component-docs.git
  2. cd component-docs/component-model/examples/example-host
  3. cargo run --release -- 1 2 <PATH>/adder.wasm
  • 이중 대시는 cargo에 전달되는 플래그와 사용자 코드에 전달되는 플래그를 구분합니다.
  • 인수 1과 2는 adder에 전달되는 인수입니다.
  • <PATH> 자리에는 생성된 adder.wasm 파일이 들어 있는 디렉터리를 대신 입력하십시오.

참고: 호스트가 WASI 인터페이스를 사용하는 컴포넌트를 실행할 때는, 빌드된 컴포넌트를 실행하기 위해 명시적으로 링커에 WASI를 추가해야 합니다.

실행에 성공하면 다음과 같은 출력이 표시되어야 합니다(물론 예제 호스트와 adder 컴포넌트의 경로는 환경에 따라 다릅니다):

cargo run --release -- 1 2 adder.wasm
   Compiling example-host v0.1.0 (/path/to/component-docs/component-model/examples/example-host)
    Finished `release` profile [optimized] target(s) in 7.85s
     Running `target/debug/example-host 1 2 /path/to/adder.wasm`
1 + 2 = 3

올바르게 구성되지 않은 경우 다음과 같은 오류가 표시될 수 있습니다:

cargo run --release -- 1 2 adder.wasm
   Compiling example-host v0.1.0 (/path/to/component-docs/component-model/examples/example-host)
    Finished `release` profile [optimized] target(s) in 7.85s
     Running `target/release/example-host 1 2 /path/to/adder.component.wasm`
Error: Failed to instantiate the example world

Caused by:
    0: component imports instance `wasi:io/error@0.2.2`, but a matching implementation was not found in the linker
    1: instance export `error` has the wrong type
    2: resource implementation is missing

이러한 종류의 오류는 일반적으로 해당 호스트가 WASI 임포트를 충족하지 못한다는 것을 나타냅니다.

Python 애플리케이션으로 HTTP, CLI, TCP 컴포넌트를 빌드해 보려면 componentize-py의 예제를 참조하십시오.

Python 애플리케이션에서 컴포넌트 실행하기

WebAssembly 컴포넌트는 Python 애플리케이션에서도 호출할 수 있습니다. 이 섹션에서는 Python 네이티브 도구를 사용하여 예제의 미리 빌드된 add.wasm 컴포넌트를 호출하는 과정을 안내합니다.

먼저 Python 3.11 이상과 pip이 아직 설치되어 있지 않다면 설치하십시오. 그런 다음 wasmtime-py를 설치하십시오:

$ pip install wasmtime

먼저 Python 호스트 애플리케이션에서 컴포넌트를 호출할 수 있도록 바인딩을 생성하십시오. 필요한 경우 이전 섹션에서 생성한 add.wasm 파일을 제거하십시오.

# Get an add component that does not import the WASI CLI world
$ wget https://github.com/bytecodealliance/component-docs/raw/main/component-model/examples/example-host/add.wasm
$ python3 -m wasmtime.bindgen add.wasm --out-dir add

생성된 add 패키지에는 컴포넌트에 필요한 모든 익스포트/임포트가 포함되어 있으며, 타입 검사와 자체 문서화를 최대한 돕도록 타입 주석이 달려 있습니다. 패키지 안에는 Root 클래스가 있으며, 이 클래스에는 컴포넌트가 익스포트한 add 함수를 호출하는 add 함수가 있습니다. 이제 add를 호출하는 Python 프로그램을 작성할 수 있습니다. 다음 코드를 복사하여 host.py라는 파일에 붙여 넣으십시오:

from add import Root
from wasmtime import Store

def main():
    store = Store()
    component = Root(store)
    print("1 + 2 =", component.add(store, 1, 2))

if __name__ == '__main__':
    main()

Python 호스트 프로그램을 실행하십시오:

$ python3 host.py
1 + 2 = 3

wasmtime-py를 통해 Python 호스트를 사용하는 또 다른 예제는 componentize-py 저장소에서 찾을 수 있습니다.


원문 © 2023 The Bytecode Alliance Contributors · WebAssembly Components Documentation · CC BY 4.0
Yeokja 한국어 번역·편집 · Anthropic 사의 claude-sonnet-5 모델을 활용하여 번역되었으며 학습을 모두 비허용한 상태로 작업하였습니다 · 이 번역은 원문을 수정한 문서이며 CC BY 4.0으로 제공합니다.