설정과 빌드

이 지침에서는 소스 코드의 작업 사본과 컴파일된 CPython 인터프리터를 얻는 방법을 설명합니다(CPython은 https://www.python.org/에서 받을 수 있는 버전의 Python입니다). 또한 CPython 소스 코드의 디렉터리 구조에 대한 개요도 제공합니다.

또는 Docker가 설치되어 있다면 공식 이미지를 사용할 수도 있습니다. 이 이미지에는 여러 Python 버전의 최신 릴리스와 Git head가 들어 있으며, 개발 및 테스트 용도로만 제공됩니다.

더 보기

빠른 참조는 Git 설치부터 풀 리퀘스트 제출까지의 과정을 간략하게 요약합니다.

Git 설치

CPython은 버전 관리에 Git을 사용하여 개발됩니다. Git 명령줄 프로그램의 이름은 git이며, 이 이름은 Git 자체를 가리킬 때도 사용됩니다. Git은 일반적으로 쓰이는 모든 운영 체제에서 쉽게 설치할 수 있습니다.

  • 설치

    CPython 저장소는 GitHub에서 호스팅되므로, 단계별 설치 방법은 GitHub 설정 지침이나 Git 프로젝트 지침을 참조하십시오. TortoiseGit이나 GitHub Desktop 같은 그래픽 클라이언트를 고려해 볼 수도 있습니다.

  • 구성

    이름과 이메일을 구성하고 SSH 키를 만드십시오. 그러면 git pull, git push, git fetch 같은 명령을 실행할 때마다 사용자 이름과 비밀번호를 입력하지 않고도 GitHub와 상호 작용할 수 있습니다. Windows에서는 autocrlf도 활성화해야 합니다.

소스 코드 받기

CPython 저장소는 GitHub에서 호스팅됩니다. 소스 코드 사본을 얻으려면 GitHub에서 Python 저장소를 포크하고, 개인 포크의 로컬 클론을 만든 다음 원격 저장소를 구성해야 합니다.

이 단계는 컴퓨터마다 한 번만 실행하면 됩니다:

  1. https://github.com/python/cpython으로 이동하십시오.

  2. 오른쪽 위의 Fork를 누르십시오.

  3. 저장소를 어디로 포크할지 물으면 자신의 사용자 이름으로 포크하도록 선택하십시오.

  4. 포크는 https://github.com/<username>/cpython에 만들어집니다.

  5. GitHub 포크를 클론하십시오(<username>을 자신의 사용자 이름으로 바꾸십시오):

    $ git clone git@github.com:<username>/cpython.git
    

    (SSH 기반 URL과 HTTPS 기반 URL 모두 사용할 수 있습니다.)

  1. upstream 원격 저장소를 추가한 다음, main은 upstream에서 풀하고 푸시는 항상 origin으로 하도록 git을 구성하십시오:

    $ cd cpython
    $ git remote add upstream https://github.com/python/cpython
    $ git config --local branch.main.remote upstream
    $ git remote set-url --push upstream git@github.com:<your-username>/cpython.git
    
  2. 설정이 올바른지 확인하십시오:

    $ git remote -v
    origin  git@github.com:<your-username>/cpython.git (fetch)
    origin  git@github.com:<your-username>/cpython.git (push)
    upstream        https://github.com/python/cpython (fetch)
    upstream        git@github.com:<your-username>/cpython.git (push)
    $ git config branch.main.remote
    upstream
    

이 명령들에 대한 자세한 내용은 Git 부트캠프와 치트 시트를 참조하십시오.

모든 작업을 올바르게 했다면 이제 cpython 디렉터리에 코드 사본이 있고, 자신의 GitHub 포크(origin)와 공식 CPython 저장소(upstream)를 가리키는 두 개의 원격 저장소가 있어야 합니다.

이미 릴리스된 Python 버전, 즉 유지 보수 모드에 있는 버전의 작업 사본이 필요하다면 릴리스 브랜치를 체크아웃할 수 있습니다. 예를 들어 Python 3.13의 작업 사본을 체크아웃하려면 git switch 3.13을 실행하십시오.

이러한 업데이트를 할 때는 CPython을 다시 컴파일해야 합니다.

CPython은 자신이 작업 사본에서 실행되고 있다는 것을 인식한다는 점에 유의하십시오. 즉, 작업 사본에서 CPython의 소스 코드를 편집하면 Python 코드의 변경 사항이 인터프리터에 즉시 반영되어 바로 사용하고 테스트할 수 있습니다. (C 코드를 변경한 경우에는 아래에 설명된 대로 영향을 받는 파일을 다시 컴파일해야 합니다.)

문서 변경도 같은 저장소에서 할 수 있습니다. 시작하기을 참조하십시오.

커밋 전 검사를 위해 pre-commit을 Git 훅으로 설치

코드가 올바르게 린트되도록 pre-commit을 Git 훅으로 설정할 것을 권장합니다:

$ pre-commit install --allow-missing-config
pre-commit installed at .git/hooks/pre-commit

이제 git commit으로 커밋할 때 pre-commit이 자동으로 실행됩니다.

컴파일과 빌드

CPython은 여러 가지 디버깅에 도움이 되는 여러 컴파일 플래그를 제공합니다. 알려진 모든 플래그는 Misc/SpecialBuilds.txt 파일에서 찾을 수 있지만, 가장 중요한 것은 “pydebug” 빌드라고 알려진 빌드를 만드는 Py_DEBUG 플래그입니다. 이 플래그는 흔한 문제를 잡는 데 도움이 되는 다양한 추가 정합성 검사를 활성화합니다. 이 플래그는 워낙 흔하게 사용되기 때문에 이 플래그를 켜는 것이 기본 컴파일 옵션으로 되어 있습니다.

항상 CPython의 pydebug 빌드에서 개발해야 합니다(그러지 말아야 하는 유일한 경우는 성능을 측정할 때입니다). 순수 Python 코드만 작업하는 경우에도 pydebug 빌드는 건너뛰어서는 안 될 여러 유용한 검사를 제공합니다.

더 보기

다양한 configure 및 빌드 플래그의 효과는 Python configure 문서에 설명되어 있습니다.

Unix

핵심 CPython 인터프리터를 빌드하는 데는 C 컴파일러만 있으면 되지만, 일부 확장 모듈은 추가 라이브러리(예: 압축을 위한 zlib 라이브러리)의 개발 헤더가 필요합니다. 어떤 작업을 하려는지에 따라, 컴파일된 인터프리터가 원하는 기능을 지원하도록 이러한 추가 요구 사항을 설치해야 할 수도 있습니다.

이러한 선택적 의존성을 설치하려면 아래의 의존성 설치 절을 참고하십시오.

이러한 의존성을 설치할 필요가 없다면, 개발용 Python을 빌드하는 기본 단계는 구성한 다음 컴파일하는 것입니다.

구성은 일반적으로 다음과 같습니다:

$ ./configure --with-pydebug

configure에는 더 많은 플래그를 사용할 수 있지만, 이것이 CPython의 pydebug 빌드를 얻기 위해 해야 하는 최소한의 작업입니다.

팁

반복되는 configure 실행 속도를 높이려면 --config-cache를 사용하십시오(--cache-file=config.cache와 동일, 축약형: -C):

$ ./configure --config-cache --with-pydebug

이렇게 하면 결과가 config.cache 파일에 캐시됩니다. 컴파일러를 바꾸거나 빌드 환경을 크게 변경한 경우에는 configure를 다시 실행하기 전에 config.cache를 삭제하십시오.

참고

특정 빌드 디렉터리에서 configure를 다시 실행하기 전이나 후에 make clean을 실행해야 할 수도 있습니다.

configure가 완료되면 다음 명령으로 CPython을 컴파일할 수 있습니다:

$ make -s -j $(nproc)

이렇게 하면 경고와 오류만 stderr에 출력되면서 CPython이 빌드됩니다. -j 인자는 make가 작업을 동시에 실행하되, 병렬 작업 수를 컴퓨터의 CPU 코어 수로 제한한다는 의미입니다. -j 플래그에 전달하는 숫자를 조정하여 병렬 작업 수의 제한을 변경할 수 있으며, 이를 통해 RAM 사용량과 컴파일 시간 사이에서 균형을 맞출 수 있습니다.

빌드가 끝나면 성공 메시지가 표시되고, 이어서 의존성이 없어서 빌드되지 않은 확장 모듈의 목록이 표시되어야 합니다:

The necessary bits to build these optional modules were not found:
_gdbm
To find the necessary bits, look in configure.ac and config.log.

Checked 106 modules (31 built-in, 74 shared, 0 n/a on macosx-13.4-arm64, 0 disabled, 1 missing, 0 failed on import)

빌드에 실패했고 C89 또는 C99 호환 컴파일러를 사용하고 있다면 issue tracker에 버그 보고를 등록하십시오.

의존성 설치를 수행하기로 했다면 configure와 make를 모두 다시 실행해야 합니다.

CPython 빌드가 끝나면 제자리에서 실행할 수 있는 작동하는 빌드를 갖게 됩니다. 대부분의 머신에서는 ./python이고(모든 예제에서 사용하는 것도 이것입니다), 대소문자를 구분하지 않는 파일 시스템을 사용하는 곳(예를 들어 기본 설정의 macOS)에서는 Python 디렉터리와의 충돌을 피하기 위해 ./python.exe입니다. 일반적으로 직접 빌드한 Python을 설치할 필요는 없습니다! 인터프리터는 자신이 어디에서 실행되는지 인식하므로 작업 사본에 있는 파일을 사용합니다. 작업 사본 빌드를 실수로 설치할까 걱정된다면 구성 단계에 --prefix=/tmp/python을 추가할 수 있습니다. 작업 디렉터리에서 실행할 때는 configure에 --enable-shared 플래그를 사용하지 않는 것이 가장 좋습니다. 매우 주의하지 않으면 방금 빌드한 인터프리터가 아니라 이전에 설치된 공유 Python 라이브러리의 코드로 실행될 수 있습니다.

Clang

clang으로 CPython을 빌드한다면, CPython에서는 특히 불필요한 몇몇 표준 경고를 끄기 위해 설정할 만한 플래그로 -Wno-unused-value -Wno-empty-body -Qunused-arguments가 있습니다. configure를 실행할 때 CFLAGS 환경 변수를 이 플래그들로 설정할 수 있습니다.

clang을 ccache와 함께 사용한다면 -Wno-parentheses-equality 플래그로 요란한 parentheses-equality 경고를 끄십시오. 이 경고는 전처리가 ccache에 의해 별도로 수행되기 때문에 clang이 확장된 매크로 안의 불필요한 괄호가 유효하다는 것을 감지할 만큼 충분한 정보를 갖지 못해서 발생합니다.

LLVM 2.8을 사용한다면 ctypes 모듈을 빌드하기 위해 -no-integrated-as 플래그도 사용하십시오(이 플래그가 없어도 CPython의 나머지 부분은 여전히 제대로 빌드됩니다).

최적화

CPython의 성능을 개선하려고 한다면 최적화된 CPython 빌드를 사용하는 것이 좋을 것입니다. 최적화를 활성화하여 CPython을 빌드하면 시간이 훨씬 오래 걸릴 수 있으며, 보통은 그렇게 할 필요가 없습니다. 하지만 제안된 성능 최적화에 대해 정확한 벤치마크 결과를 얻으려면 반드시 필요합니다.

Python을 최적화하여 빌드하려면 configure --enable-optimizations --with-lto를 사용하십시오. 이렇게 하면 프로파일 기반 최적화(PGO)를 활성화하도록 기본 make 타깃이 설정되며, 일부 플랫폼에서는 링크 타임 최적화(LTO)를 자동으로 활성화하는 데 사용될 수 있습니다. 이 옵션들에 대해 자세히 알아보려면 --enable-optimizations 및 --with-lto를 참조하십시오.

$ ./configure --enable-optimizations --with-lto

Windows

참고

Linux용 Windows 하위 시스템(WSL)을 사용하고 있다면, PowerShell이나 cmd.exe 명령 프롬프트 같은 네이티브 Windows 셸 프로그램에서 저장소를 복제하고, Windows를 대상으로 빌드된 Git을 사용하십시오. 예를 들어 Git for Windows download from the official Git website를 사용할 수 있습니다. 그렇지 않으면 Visual Studio가 프로젝트의 모든 파일을 찾지 못해 빌드에 실패합니다.

Windows에서 Python을 빌드하는 과정을 단계별로 간결하게 정리한 내용은 Victor Stinner’s guide에서 읽을 수 있습니다.

지원되는 모든 Python 버전은 Microsoft Visual Studio 2017 이상으로 빌드할 수 있습니다. Visual Studio의 무료 또는 유료 버전 중 어느 것이든 내려받아 사용할 수 있습니다.

설치할 때 필요한 빌드 도구를 모두 얻으려면 Python development 워크로드와 선택 사항인 Python native development tools 구성 요소를 선택하십시오. Git for Windows가 아직 설치되어 있지 않다면 Individual components 탭에서 찾을 수 있습니다.

참고

MSI 설치 프로그램을 빌드하려면, 해당 빌드 도구 체인이 그 빌드 도구 체인은 Microsoft .NET Framework 버전 3.5에 대한 의존성이 있다는 점에 유의하십시오 (Windows 10 같은 최신 버전의 Windows에는 포함되어 있지 않을 수 있습니다). 최신 Windows 버전에서 빌드한다면 제어판(Programs ‣ Programs and Features ‣ Turn Windows Features on or off)을 사용하여 .NET Framework 3.5 (includes .NET 2.0 and 3.0) 항목이 활성화되어 있는지 확인하십시오.

첫 빌드는 외부 의존성이 모두 다운로드되도록 명령줄에서 실행해야 합니다:

PCbuild\build.bat -c Debug

위의 명령줄 빌드는 -c Debug 인자를 사용하여 Debug 구성으로 빌드하며, 이 구성은 Python 개발에 도움이 되는 검사와 어서션을 활성화합니다. 기본적으로는 Release 구성으로, 그리고 32비트 Win32가 아닌 64비트 x64 플랫폼용으로 빌드합니다. 빌드 구성과 플랫폼은 각각 -c와 -p로 제어하십시오.

이 빌드가 성공한 후에는 원한다면 Visual Studio IDE에서 PCbuild\pcbuild.sln 솔루션을 열어 개발을 계속할 수 있습니다. Visual Studio에서 빌드할 때는 도구 모음의 드롭다운 메뉴에서 스크립트에 사용한 것과 일치하는 빌드 설정(Debug 구성과 x64 플랫폼)을 선택해야 합니다.

참고

빌드 구성이나 플랫폼을 변경해야 한다면, 모든 파일이 제대로 다시 빌드되도록 VS에서 해당 옵션으로 빌드하기 전에 먼저 build.bat 스크립트를 그 옵션으로 설정하여 한 번 빌드하십시오. 그렇지 않으면 다시 빌드되지 않은 모듈을 로드할 때 오류가 발생할 수 있습니다.

PGInstrument와 PGUpdate 구성은 일반적인 개발용이 아니라 PGO 빌드용이므로 선택하지 마십시오.

컴파일한 Python 빌드는 다음과 같이 실행할 수 있습니다:

PCbuild\amd64\python_d.exe

그 밖에 필요한 소프트웨어와 빌드 방법에 대한 자세한 내용은 PCBuild readme를 참조하십시오.

WASI

WASI는 WebAssembly를 위한 시스템 인터페이스 표준입니다. WebAssembly를 대상으로 할 수 있는 C 컴파일러와 WASI용 POSIX 호환 심(shim)을 제공하는 wasi-libc를 조합하면 CPython을 WASI 호스트/런타임에서 게스트로 실행할 수 있습니다.

참고

CPython의 크로스 컴파일은 ./configure / make를 기준으로 설계되었으므로, 아래 지침은 Unix 기반 OS를 가정합니다.

WASI용으로 빌드하려면 CPython을 크로스 컴파일해야 합니다. 이를 위해서는 Unix용으로 빌드할 때와 마찬가지로 C 컴파일러가 필요하며, 그 외에도 다음이 필요합니다:

  1. WebAssembly를 대상으로 할 수 있는 C 컴파일러(예: WASI SDK)

  2. WASI 호스트/런타임(예: Wasmtime)

  3. 빌드 스크립트를 실행하기 위해 시스템에 설치된 Python 3.11 이상

이 모든 것은 WASI 개발 컨테이너에서 제공됩니다(코드스페이스를 사용할 때 대체 컨테이너로 선택할 수 있습니다). 또한 컨테이너에 설치된 것을 참고하여 이러한 도구의 어떤 버전이 동작하는 것으로 알려져 있는지 확인할 수도 있습니다.

참고

CPython은 WASI용으로 특정 도구로만 검증되었습니다. 다른 컴파일러, 호스트 또는 WASI 버전을 사용해도 동작해야 하지만, 빌드봇을 통해 테스트되는 것은 컨테이너와 빌드 스크립트에 지정된 도구와 그 버전입니다.

WASI용으로 빌드하려면 CPython의 WASI 빌드를 만드는 데 도움을 주는 빌드 Python을 두는 크로스 빌드를 수행해야 합니다(빌드 Python이 대상 Python이기도 하고 호스트 빌드는 WASI 빌드이므로, 기술적으로는 “host x host” 크로스 빌드입니다). 즉, 사실상 CPython을 두 번 빌드하게 됩니다. 한 번은 빌드 시스템이 사용할 Python 버전을 얻기 위해서이고, 다른 한 번은 최종적으로 필요한 빌드를 얻기 위해서입니다(즉, 빌드 Python은 여러분이 직접 사용하기 위한 것이 아니라 빌드 시스템만을 위한 것입니다).

WASI용 CPython 디버그 빌드를 얻는 가장 쉬운 방법은 Python 3.11 이상으로 다음 명령을 실행하는 것입니다:

python Platforms/WASI build --quiet -- --config-cache --with-pydebug
python Tools/wasm/wasi build --quiet -- --config-cache --with-pydebug
python Tools/wasm/wasi.py build --quiet -- --config-cache --with-pydebug

이 명령 하나로 cross-build/ 디렉터리에 빌드 Python과 WASI 빌드를 모두 구성하고 빌드합니다.

각 구성 및 빌드 단계를 따로 수행할 수도 있습니다. 위 명령은 다음 명령들을 편리하게 감싼 래퍼입니다:

$ python Platforms/WASI configure-build-python --quiet -- --config-cache --with-pydebug
$ python Platforms/WASI make-build-python --quiet
$ python Platforms/WASI configure-host --quiet -- --config-cache
$ python Platforms/WASI make-host --quiet
$ python Tools/wasm/wasi configure-build-python --quiet -- --config-cache --with-pydebug
$ python Tools/wasm/wasi make-build-python --quiet
$ python Tools/wasm/wasi configure-host --quiet -- --config-cache
$ python Tools/wasm/wasi make-host --quiet
$ python Tools/wasm/wasi.py configure-build-python --quiet -- --config-cache --with-pydebug
$ python Tools/wasm/wasi.py make-build-python --quiet
$ python Tools/wasm/wasi.py configure-host --quiet -- --config-cache
$ python Tools/wasm/wasi.py make-host --quiet

참고

configure-host 명령은 빌드 Python을 바탕으로 --with-pydebug 사용 여부를 추론합니다.

예를 들어 코드를 변경한 후 make-host 단계만 실행하려는 경우에는 build 이후의 개별 명령을 따로 실행하는 것이 유용합니다.

모든 작업이 완료되면 python.wasm 파일을 실행하는 데 사용할 수 있는 cross-build/wasm32-wasip1/python.sh 도우미 파일이 생성됩니다(configure-host 하위 명령의 출력을 참고하십시오):

cross-build/wasm32-wasip1/python.sh --version

Makefile 타깃도 사용할 수 있으며, HOSTRUNNER 환경 변수가 python.sh에서 사용하는 값과 비슷한 값으로 설정되어 있으므로 예상대로 동작합니다:

make -C cross-build/wasm32-wasip1 test

참고

WASI는 기능 기반(capability-based) 보안 모델을 사용합니다. 즉, 사용자가 지시하지 않는 한 WASI 호스트는 사용자의 컴퓨터에 대한 전체 접근 권한을 주지 않습니다. 또한 파일 같은 것들이 WASI 호스트 내부에서 다른 경로로 매핑될 수 있다는 뜻이기도 합니다. 따라서 python.wasm/ python.sh에 파일 경로를 전달하려면, 그 경로는 사용자 컴퓨터상의 경로가 아니라 WASI 호스트 내부의 경로와 일치해야 합니다(컨테이너를 사용할 때와 매우 비슷합니다).

Emscripten

Emscripten은 완전한 오픈 소스 컴파일러 도구 체인입니다. C/C++ 코드를 브라우저와 Node.js를 포함한 JavaScript 런타임에서 사용할 수 있는 WebAssembly/JavaScript 실행 파일로 컴파일합니다.

참고

CPython의 크로스 컴파일은 ./configure / make를 기준으로 설계되어 있으므로, 아래 안내는 Unix 기반 OS를 전제로 합니다.

Emscripten용으로 빌드하려면 CPython을 교차 컴파일해야 합니다. 이를 위해서는 유닉스용으로 빌드할 때와 마찬가지로 C 컴파일러가 필요합니다. Node 버전 관리자(nvm)도 경로에 있어야 합니다.

Emscripten용으로 빌드하려면 교차 빌드를 수행해야 하며, 이때 CPython의 Emscripten 빌드를 만드는 데 도움을 주는 빌드 Python이 필요합니다. 즉, CPython을 두 번 빌드합니다. 한 번은 빌드 시스템이 사용할 Python 버전을 얻기 위해서이고, 다른 한 번은 최종적으로 필요한 빌드를 얻기 위해서입니다(즉, 빌드 Python은 사용자가 직접 사용하기 위한 것이 아니라 빌드 시스템만을 위한 것입니다).

Emscripten용으로 빌드하는 가장 간단한 방법은 다음을 실행하는 것입니다:

export EMSDK_CACHE=$PWD/cross-build/emsdk
python3 Platforms/emscripten install-emscripten
python3 Platforms/emscripten build all

install-emscripten은 필요한 버전의 Emscripten SDK를 내려받아 설치하고, 이를 EMSDK_CACHE 디렉터리에 둡니다. build all은 다음을 수행합니다:

  1. 호스트 머신에서 실행할 수 있는 Python 사본(“빌드” python)을 빌드합니다.

  2. nvm을 사용하여 필요한 버전의 Node가 설치되어 있도록 합니다.

  3. Python의 모든 바이너리 의존성(libffi와 mpdecimal 등)의 코드를 내려받아 Emscripten용으로 컴파일합니다.

  4. Emscripten에서 실행할 수 있는 Python 사본(“호스트” python)을 빌드합니다.

빌드된 바이너리 의존성은 Emscripten 캐시 디렉터리 안에 캐시됩니다. 특정 Emscripten 버전용으로 한 번 빌드되면, 해당 의존성의 버전이나 빌드 스크립트가 변경되지 않는 한 이후 실행에서 다시 빌드되지 않습니다.

nvm이 ${HOME}/.nvm에 설치되어 있다고 가정합니다. nvm이 설치되어 있지 않거나 사용하고 싶지 않다면 build 명령에 --host-runner node를 전달할 수 있습니다. 인자는 PATH에서 찾을 수 있는 실행 파일의 이름이거나, 실행 파일에 대한 상대 경로 또는 절대 경로여야 합니다.

EMSDK_CACHE 환경 변수를 생략하면 빌드 스크립트는 현재 환경에서 Emscripten 도구를 사용할 수 있다고 가정합니다. 해당 도구를 내려받아 환경에서 활성화하는 것은 사용자의 책임입니다. Python을 빌드하는 데 필요한 Emscripten 및 Node 버전은 Platforms/emscripten/config.toml 구성 파일에 정의되어 있습니다.

Platforms/emscripten 빌드 스크립트의 동작을 제어하는 데 사용할 수 있는 환경 변수는 두 가지입니다:

  • EMSDK_CACHE(또는 --emsdk-cache 플래그)는 Emscripten SDK 캐시 디렉터리의 위치를 제어합니다. --emsdk-cache 플래그를 전달하는 대신 이 환경 변수를 사용할 수 있습니다. 이 변수를 설정하면 빌드 스크립트는 필요한 Emscripten 버전이 캐시에 있는지 검증하고, 없으면 오류와 함께 종료합니다. 캐시를 채우려면 install-emscripten을 실행하십시오.

  • CROSS_BUILD_DIR(또는 --cross-build-dir 플래그)는 빌드에 사용할 cross-build 디렉터리의 위치를 정의합니다. 이는 여러 버전의 Python 빌드를 나란히 유지해야 할 때 유용할 수 있습니다.

EM_COMPILER_WRAPPER 환경 변수를 설정하여 Emscripten 빌드에 ccache를 활성화할 수 있습니다(필수는 아닙니다):

export EM_COMPILER_WRAPPER=ccache

Emscripten용 CPython 디버그 빌드를 만들려면 다음을 사용하십시오:

python3 Platforms/emscripten build all -- --with-pydebug

이 명령 하나로 빌드 Python과 Emscripten 빌드를 각각 cross-build/build와 cross-build/wasm32-emscripten/build/python/에 구성하고 빌드합니다.

Platforms/emscripten 스크립트에는 Emscripten 빌드의 각 부분을 세밀하게 실행할 수 있는 여러 다른 진입점이 있습니다. 자세한 내용은 python3 Platforms/emscripten --help를 실행하여 확인하십시오.

빌드가 완료되면 다음을 사용하여 Python 코드를 실행할 수 있습니다:

python3 Platforms/emscripten run ./path/to/script.py

다음을 사용하여 CPython 테스트 스위트를 실행할 수 있습니다:

python3 Platforms/emscripten run --test

생성된 빌드를 (Node.js 및/또는 웹 브라우저를 통해) 실행하는 방법에 관한 추가 지침은 CPython 저장소의 Platforms/emscripten/README.md에서 확인할 수 있습니다.

Android

Android용 빌드 및 테스트 지침은 CPython 저장소의 Platforms/Android/README.md에서 관리됩니다.

iOS

iOS용 Python을 컴파일하려면 최신 버전의 macOS에서 최신 버전의 Xcode를 실행하는 macOS 머신이 필요합니다. Apple은 개발자가 운영 체제와 도구를 최신 상태로 유지하기를 기대합니다. macOS 버전이 메이저 릴리스 한 개를 넘게 뒤처져 있거나 Xcode 버전이 마이너 버전 두어 개를 넘게 뒤처져 있다면 문제를 겪을 가능성이 높습니다. Windows나 Linux를 빌드 머신으로 사용하여 iOS용으로 컴파일할 수는 없습니다.

iOS용 Python을 완전히 빌드하려면 CPython을 네 번 컴파일해야 합니다. macOS용으로 한 번 컴파일한 다음, iOS가 사용하는 다음 세 가지 기반 플랫폼 각각에 대해 한 번씩 컴파일합니다:

  • ARM64 기기(iPhone 또는 iPad),

  • 최신 macOS 머신에서 실행되는 ARM64 시뮬레이터, 그리고

  • 구형 macOS 머신에서 실행되는 x86_64 시뮬레이터입니다.

Python을 빌드하려면 기존 Python 3 인터프리터가 필요합니다. CPython 코드 체크아웃의 루트에서 다음을 실행하십시오:

$ python3 Platforms/Apple build iOS all
$ python3 Apple build iOS all

Python 3.13에서는 각 플랫폼에 대해 configure와 make를 명시적으로 호출해야 합니다. 예를 들어, ARM64 시뮬레이터용으로 빌드하려면 다음을 실행하십시오:

$ export PATH="$(pwd)/iOS/Resources/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
$ ./configure \
      LIBLZMA_CFLAGS="-Ipath/to/xz/include" \
      LIBLZMA_LIBS="-Lpath/to/xz/lib -llzma" \
      BZIP2_CFLAGS="-Ipath/to/bzip2/include" \
      BZIP2_LIBS="-Lpath/to/bzip2/lib -lbz2" \
      LIBFFI_CFLAGS="-Ipath/to/libffi/include" \
      LIBFFI_LIBS="-Lpath/to/libffi/lib -lffi" \
      --with-openssl="path/to/openssl" \
      --host=arm64-apple-ios-simulator \
      --build=arm64-apple-darwin \
      --with-build-python=path/to/python3.13 \
      --enable-framework
$ make -j4 all
$ make install

--host 인자는 arm64-apple-ios-simulator, x64_64-apple-ios-simulator, arm64-apple-ios 중 하나여야 합니다. ARM64 macOS 바이너리가 실수로 iOS 프로젝트에 링크되지 않도록 PATH는 최소한으로 유지해야 합니다. 미리 컴파일된 바이너리 의존성의 경로를 반드시 지정해야 합니다.

각 아키텍처용 Apple Framework를 빌드한 후에는 XCframework를 수동으로 구성해야 합니다.

이 명령은 다음을 수행합니다:

  1. macOS에서 실행할 수 있는 Python 사본(“빌드” Python)을 빌드합니다;

  2. CPython 의존성(예: libFFI, xz)의 미리 컴파일된 바이너리를 내려받습니다.

  3. 지원되는 각 iOS 아키텍처(x86_64 시뮬레이터, ARM64 시뮬레이터, ARM64 기기)용 Python 사본을 빌드합니다; 그리고

  4. iOS용 릴리스 아티팩트를 생성합니다.

이 빌드가 완료되면 cross-build/iOS 폴더에는 Python.xcframework가, cross-build/dist 폴더에는 릴리스 tarball이 들어 있게 됩니다.

iOS에서 테스트 스위트를 실행하려면 다음을 실행하십시오:

$ python3 Platforms/Apple test iOS
$ python3 Apple test iOS
$ make testios

전체 테스트 스위트는 2022년형 M1 MacBook Pro에서 실행하는 데 약 12분이 걸리며, 테스트베드 애플리케이션을 빌드하고 시뮬레이터를 부팅하는 데 몇 분이 추가로 걸립니다. 테스트 과정에서 iOS 시뮬레이터가 나타납니다. 시뮬레이터가 iOS 시작 화면으로 부팅되고, 테스트베드 앱이 설치된 다음 실행됩니다. 테스트 스위트가 실행되는 동안 시뮬레이터 화면은 검은색으로 표시됩니다. 테스트 스위트가 완료되면 성공 또는 실패 여부가 명령줄에 보고됩니다.

두 가지 환경 변수를 사용하여 Apple 빌드 스크립트의 동작을 구성할 수 있습니다:

  • CACHE_DIR은 미리 컴파일된 libFFI 및 xz 바이너리 같은 다운로드된 아티팩트가 저장될 위치를 정의합니다.

  • CROSS_BUILD_DIR은 빌드에 사용될 cross-build 디렉터리의 이름을 정의합니다. 여러 버전의 Python 빌드를 유지해야 하는 경우에 유용할 수 있습니다.

Platforms/Apple 스크립트에는 iOS 빌드의 각 부분을 세분화하여 실행할 수 있는 여러 다른 진입점이 있습니다. 자세한 내용은 python3 Platforms/Apple --help를 실행하십시오.

Xcode 자체에서 테스트 스위트를 실행할 수도 있습니다. 실제 기기에서 실행하려면 이 방법을 사용해야 합니다. 자세한 내용은 iOS README를 참조하십시오.

의존성 설치

이 섹션에서는 CPython의 일부 모듈(예: zlib)을 컴파일하는 데 필요한 라이브러리를 설치하는 방법을 설명합니다.

Unix 기반 시스템에서는 가능한 한 시스템 라이브러리를 사용하려고 합니다. 따라서 선택적 구성 요소는 관련 시스템 헤더를 사용할 수 있는 경우에만 빌드됩니다. 이러한 헤더를 얻는 가장 좋은 방법은 배포판마다 다르지만, 몇몇 주요 배포판용 명령은 아래에 나와 있습니다.

Fedora, RHEL, CentOS 및 기타 dnf 기반 시스템에서는:

$ sudo dnf install git pkg-config
$ sudo dnf install dnf-plugins-core  # install this to use 'dnf builddep'
$ sudo dnf builddep python3

일부 선택적 개발 의존성은 위 목록에 포함되어 있지 않습니다. 선택적 빌드 및 테스트 구성 요소를 위한 추가 의존성을 설치하려면:

$ sudo dnf install \
      gcc gcc-c++ gdb lzma glibc-devel libstdc++-devel openssl-devel \
      readline-devel zlib-devel libzstd-devel libffi-devel bzip2-devel \
      xz-devel sqlite sqlite-devel sqlite-libs libuuid-devel gdbm-libs \
      perf expat expat-devel mpdecimal python3-pip

Debian, Ubuntu 및 기타 apt 기반 시스템에서는 apt 명령을 사용하여 작업 중인 Python의 의존성을 설치해 보십시오.

먼저 소스 목록에서 소스 패키지를 활성화했는지 확인하십시오. 소스 목록의 위치는 사용하는 릴리스에 따라 다릅니다.

Ubuntu 24.04 이상 및 deb822 형식을 사용하는 기타 릴리스에서는 소스가 /etc/apt/sources.list.d/ubuntu.sources에 있습니다. 소스를 받으려는 항목의 Types 필드에 deb-src를 추가하십시오.:

$ sudo nano /etc/apt/sources.list.d/ubuntu.sources

다음 내용을:

Types: deb

다음과 같이 변경하십시오.:

Types: deb deb-src

Ubuntu 22.04 및 한 줄 형식을 사용하는 기타 릴리스에서는 URL, 배포판 이름, 구성 요소 이름을 포함한 소스 패키지의 위치를 /etc/apt/sources.list에 추가하십시오. Ubuntu 22.04 LTS(Jammy Jellyfish)를 예로 들면 다음과 같습니다.:

$ deb-src http://archive.ubuntu.com/ubuntu/ jammy main

또는 편집기를 사용하여 deb-src가 있는 줄의 주석을 해제하십시오. 예를 들면 다음과 같습니다.:

$ sudo nano /etc/apt/sources.list

Debian 같은 다른 배포판에서는 URL과 이름을 해당 배포판에 맞게 변경하십시오.

그런 다음 패키지 색인을 업데이트하십시오.:

$ sudo apt-get update

이제 apt를 통해 빌드 의존성을 설치할 수 있습니다.:

$ sudo apt-get build-dep python3
$ sudo apt-get install pkg-config

모든 선택적 모듈을 빌드하려면 다음 패키지와 그 의존성을 설치하십시오.:

$ sudo apt-get install build-essential gdb lcov pkg-config \
      libbz2-dev libffi-dev libgdbm-dev libgdbm-compat-dev liblzma-dev \
      libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev \
      lzma lzma-dev tk-dev uuid-dev zlib1g-dev libmpdec-dev libzstd-dev \
      inetutils-inetd

Debian 12와 Ubuntu 24.04에는 libmpdec-dev 패키지가 없다는 점에 유의하십시오. 위 설치 목록에서 이 패키지를 제거해도 괜찮으며, 이 경우 Python 빌드는 번들된 버전을 사용합니다. 하지만 시스템의 libmpdec 라이브러리를 사용하는 것을 권장합니다. 소스에서 직접 빌드하거나 https://deb.sury.org에서 이 패키지를 설치하십시오.

macOS 시스템(버전 10.9 이상)에서는 개발자 도구를 자동으로 다운로드하여 설치할 수 있으므로, Xcode 애플리케이션 전체를 다운로드할 필요는 없습니다.

필요하면 다음 명령을 실행하십시오.:

$ xcode-select --install

이렇게 하면 시스템 헤더 파일도 /usr/include에 설치됩니다.

또한 macOS에는 libzma를 비롯하여 Python 표준 라이브러리가 사용하는 여러 라이브러리가 포함되어 있지 않으므로, 이러한 라이브러리를 로컬에 따로 설치하지 않으면 일부 확장 모듈의 빌드가 실패할 수 있다는 점에 유의하십시오. OS X 10.11부터 Apple은 폐지 예정인 시스템 버전 OpenSSL의 헤더 파일을 더 이상 제공하지 않으므로, _ssl 확장을 빌드할 수 없습니다. 한 가지 해결책은 Homebrew나 MacPorts 같은 서드파티 패키지 관리자로 이러한 라이브러리를 설치한 다음, 헤더 파일과 라이브러리 파일의 적절한 경로를 configure 명령에 추가하는 것입니다.

Homebrew에서는 brew를 사용하여 의존성을 설치하십시오.:

$ brew bundle --file=Misc/Brewfile

Python 3.11 이상의 경우:

$ GDBM_CFLAGS="-I$(brew --prefix gdbm)/include" \
   GDBM_LIBS="-L$(brew --prefix gdbm)/lib -lgdbm" \
   ./configure --config-cache \
               --with-pydebug \
               --with-openssl="$(brew --prefix openssl@3)"

Python 3.10의 경우:

$ CPPFLAGS="-I$(brew --prefix gdbm)/include -I$(brew --prefix xz)/include" \
   LDFLAGS="-L$(brew --prefix gdbm)/lib -L$(brew --prefix xz)/lib" \
   ./configure --config-cache \
               --with-pydebug \
               --with-openssl="$(brew --prefix openssl@3)" \
               --with-tcltk-libs="$(pkg-config --libs tcl tk)" \
               --with-tcltk-includes="$(pkg-config --cflags tcl tk)" \
               --with-dbmliborder=gdbm:ndbm

(--with-dbmliborder는 Homebrew가 gdbm에 적용한 고유한 변경 사항을 우회하기 위한 방법입니다. 자세한 내용은 #89452를 참조하십시오.)

MacPorts의 경우 port를 사용하여 의존성을 설치하십시오:

$ sudo port install pkgconfig openssl xz gdbm tk +quartz mpdecimal zstd

Python 3.13 이상의 경우:

$ GDBM_CFLAGS="-I$(dirname $(dirname $(which port)))/include" \
   GDBM_LIBS="-L$(dirname $(dirname $(which port)))/lib -lgdbm" \
   ./configure --config-cache \
               --with-pydebug \
               --with-system-libmpdec

Python 3.11 및 3.12의 경우:

$ GDBM_CFLAGS="-I$(dirname $(dirname $(which port)))/include" \
   GDBM_LIBS="-L$(dirname $(dirname $(which port)))/lib -lgdbm" \
   ./configure --config-cache \
               --with-pydebug

마지막으로 make를 실행하십시오:

$ make -s -j8

새 릴리스에 선택적 모듈이 추가되었지만 아직 OS 수준의 빌드 의존성에 반영되지 않은 경우가 가끔 있습니다. 그런 경우에는 Discourse의 Core Development 카테고리에서 도움을 요청하십시오.

루트 권한 없이 Unix 기반 시스템에서 선택적 의존성을 빌드하는 방법은 이 가이드의 범위를 벗어납니다.

빌드와 관련된 다양한 옵션과 고려 사항에 대한 자세한 내용은 macOS README를 참조하십시오.

참고

CPython을 빌드하려면 C 컴파일러가 필요하지만, 기여하는 데에는 C 언어 지식이 전혀 필요하지 않습니다! CPython의 상당 부분은 전적으로 Python으로 작성되어 있습니다. 이 글을 쓰는 시점에서 CPython에는 C 코드보다 Python 코드가 약간 더 많습니다.

Windows에서는 확장 모듈이 이미 포함되어 있으며 자동으로 빌드됩니다.

BeeWare 프로젝트는 scripts for building Android dependencies를 유지 관리하며, 각 의존성에 대해 pre-compiled Android binaries를 배포합니다. 이 바이너리는 Platforms/Android에 있는 CPython 빌드 스크립트가 자동으로 내려받아 사용합니다.

BeeWare 프로젝트는 scripts for building iOS dependencies를 유지 관리하며, 각 의존성에 대해 pre-compiled iOS binaries를 배포합니다. 이 바이너리는 Platforms/Apple에 있는 CPython 빌드 스크립트가 자동으로 내려받아 사용합니다.

Python 3.13용으로 빌드하는 경우에는 이 바이너리를 직접 내려받아 설치하고, configure 호출 시 바이너리 경로를 함께 지정해야 합니다.

configure 재생성

Python에 POSIX 시스템 고유의 기능(예: 새로운 시스템 호출 사용)에 의존하는 변경을 가하는 경우, 해당 기능을 사용할 수 있는지 검사하도록 configure 스크립트를 갱신해야 합니다. Python의 configure 스크립트는 GNU Autoconf를 사용하여 configure.ac에서 생성됩니다.

configure.ac를 편집한 후에는 make regen-configure를 실행하여 configure, pyconfig.h.in, aclocal.m4를 생성하십시오. configure.ac를 변경한 풀 리퀘스트를 제출할 때는 생성된 파일의 변경 사항도 함께 커밋해야 합니다.

Python의 configure.ac 스크립트에는 특정 버전의 GNU Autoconf가 필요합니다. Python 3.12 이상에서는 GNU Autoconf v2.71이 필요합니다. Python 3.11 이하에서는 GNU Autoconf v2.69가 필요합니다.

configure를 재생성하는 권장 방법이자 단연 가장 쉬운 방법은 다음과 같습니다:

$ make regen-configure

이 방법은 Podman이나 Docker를 사용하여 적절한 버전의 GNU Autoconf로 재생성을 수행합니다.

make regen-configure를 사용할 수 없거나 사용하고 싶지 않다면 autoconf-archive와 pkg-config 유틸리티를 설치하고, pkg.m4 매크로 파일이 적절한 aclocal 위치에 있는지 확인하십시오:

$ ls $(aclocal --print-ac-dir) | grep pkg.m4

참고

autoreconf를 실행하는 것은 autoconf를 실행하는 것과 같지 않습니다. 예를 들어 autoconf만 단독으로 실행하면 pyconfig.h.in이 재생성되지 않습니다. autoreconf는 필요에 따라 autoconf와 여러 다른 도구를 반복해서 실행합니다.

ABI 덤프 재생성하기

유지 보수 브랜치(main 제외)에는 Doc/data/pythonX.Y.abi에 특수한 파일이 있으며, 이 파일을 통해 특정 풀 리퀘스트가 공개 ABI에 영향을 주는지 알 수 있습니다. 이 파일은 GitHub CI의 Check if the ABI has changed라는 검사에서 사용되며, 이 검사는 풀 리퀘스트에 ABI 변경 사항이 있는데 ABI 파일이 갱신되지 않은 경우 실패합니다.

이 검사는 안전장치 역할을 하며, 검사가 실패했다고 해서 반드시 풀 리퀘스트를 병합할 수 없다는 뜻은 아닙니다. 이 검사가 실패하면 관련 릴리스 관리자를 PR에 추가하여, 릴리스 관리자가 변경 사항을 인지하고 해당 변경이 가능한지 검증할 수 있도록 해야 합니다.

중요

ABI 변경은 첫 번째 릴리스 후보 이전까지 허용됩니다. 첫 번째 릴리스 후보 이후의 모든 릴리스는 네이티브 확장 및 Python 인터프리터와 상호 작용하는 기타 도구와의 호환성을 보장하기 위해 동일한 ABI를 유지해야 합니다. 릴리스 후보 단계에 관한 문서를 참조하십시오.

PR 검사가 실패하면 해당 실행에 갱신된 ABI 파일이 아티팩트로 첨부됩니다. 릴리스 관리자의 승인을 받은 후 이 파일을 내려받아 PR에 추가하면 검사를 통과할 수 있습니다.

regen abidump Make 타깃을 호출하여 ABI 파일을 직접 재생성할 수 있습니다. 이렇게 하려면 GitHub CI가 검사에 사용하는 것과 동일한 환경에서 ABI 파일을 재생성해야 한다는 점에 유의하십시오. 플랫폼마다 플랫폼별 세부 사항이 포함될 수 있어서, Python ABI가 같더라도 검사가 실패할 수 있기 때문입니다. CI와 같은 플랫폼을 사용하여 ABI 파일을 재생성하는 더 쉬운 방법은 Docker를 사용하는 것입니다:

# In the CPython root:
$ docker run -v$(pwd):/src:Z -w /src --rm -it ubuntu:22.04 \
    bash /src/.github/workflows/regen-abidump.sh

스크립트 실행에 사용하는 ubuntu 버전이 중요하며, CI가 ABI를 검사할 때 사용하는 버전과 반드시 일치해야 한다는 점에 유의하십시오. 자세한 내용은 .github/workflows/build.yml 파일을 참조하십시오.

빌드 문제 해결하기

이 섹션에서는 Python을 컴파일하는 동안 발생할 수 있는 일반적인 문제와 그 해결 방법을 제시합니다.

자동으로 생성된 파일을 다시 만들지 않기

경우에 따라 make를 실행하는 동안 Parser/asdl_c.py나 Python/makeopcodetargets.py 같은 스크립트에서 파이썬 오류가 발생할 수 있습니다. Python은 자체 코드의 일부를 자동으로 생성하므로, 처음부터 전체 빌드를 하려면 자동 생성 스크립트를 실행해야 합니다. 하지만 이 때문에 Python을 빌드하려면 이미 설치된 Python 인터프리터가 필요합니다. 또한 새 버전(3.x)의 Python이 설치된 상태에서 이전 버전(2.x)의 Python을 빌드하거나 그 반대의 경우에는 버전 불일치가 발생할 수도 있습니다.

이 문제를 해결하기 위해 자동 생성된 파일도 Git 저장소에 체크인됩니다. 따라서 자동 생성 스크립트를 건드리지 않는다면 실제로 무언가를 자동 생성할 필요는 없습니다.

편집기와 도구

Python은 매우 널리 사용되기 때문에 사실상 모든 코드 편집기가 어떤 형태로든 Python 코드 작성을 지원합니다. 다양한 코딩 도구도 Python을 지원합니다.

코어 개발자들이 Python으로 코딩하는 데 특별한 설명이 필요하다고 느낀 편집기와 도구는 추가 자료를 참조하십시오.

디렉터리 구조

CPython 소스 트리에는 여러 개의 최상위 디렉터리가 있습니다. 각 디렉터리에 무엇이 들어가도록 되어 있는지 알면 특정 기능이 어디에 구현되어 있는지 찾는 데 도움이 됩니다. 다만 모든 규칙에는 언제나 예외가 있다는 점을 알아 두십시오.

Doc

공식 문서입니다. https://docs.python.org/ 에서 사용하는 것이 바로 이 문서입니다. 문서 빌드하기도 참조하십시오.

Grammar

Python의 PEG(Parser Expression Grammar) 문법 파일이 들어 있습니다.

Include

인터프리터 전반에서 사용하는 모든 헤더 파일이 들어 있습니다.

Lib

표준 라이브러리 중 순수 Python으로 구현된 부분입니다.

Mac

Mac 전용 코드입니다(예를 들어 IDLE을 macOS 애플리케이션으로 사용하기 위한 코드).

Misc

다른 곳에 속하지 않는 것들입니다. 일반적으로 다양한 종류의 개발자용 문서입니다.

Modules

표준 라이브러리 중 C로 구현된 부분(및 기타 일부 코드)입니다.

Objects

모든 내장 타입의 코드입니다.

PC

Windows 전용 코드입니다.

PCbuild

python.org에서 제공하는 Windows 설치 프로그램에 현재 사용되는 MSVC 버전용 빌드 파일입니다.

Parser

파서 관련 코드입니다. AST 노드의 정의도 여기에 있습니다.

Programs

CPython 인터프리터의 main 함수를 포함한 C 실행 파일의 소스 코드입니다.

Python

CPython 런타임의 핵심을 구성하는 코드입니다. 여기에는 컴파일러, 평가 루프(eval loop), 다양한 내장 모듈이 포함됩니다.

Tools

Python 유지 관리에 사용되는(또는 사용되었던) 다양한 도구입니다.

컨테이너 사용하기

컴퓨터에 추가 도구를 설치하지 않고 컨테이너를 사용하여 CPython을 빌드하는 방법은 여러 가지가 있습니다. 모든 방법은 어떤 식으로든 cpython-devcontainers repo에 정의된 컨테이너를 사용합니다.

GitHub Codespaces를 사용하여 기여하기

GitHub Codespaces란 무엇입니까?

로컬 개발 환경을 구성하지 않고 CPython에 기여를 시작하고 싶다면 GitHub Codespaces를 사용할 수 있습니다. Codespaces는 GitHub에서 제공하는 클라우드 기반 개발 환경으로, 개발자가 웹 브라우저나 Visual Studio Code(VS Code) 안에서 바로 코드를 작성, 빌드, 테스트, 디버그할 수 있게 해 줍니다.

시작을 돕기 위해 CPython에는 devcontainer 폴더가 있으며, 이 폴더에는 프로젝트의 모든 사용자에게 일관되고 버전 관리되는 codespace 구성을 제공하는 JSON 구성 파일이 들어 있습니다. 또한 이 폴더에는 Dockerfile도 들어 있어, 직접 사용하는 편을 선호한다면 같은 환경을 로컬의 Docker 컨테이너에 구성할 수 있습니다.

CPython codespace 만들기

다음은 Codespaces를 사용하여 풀 리퀘스트로 기여하는 데 필요한 기본 단계입니다. 먼저 GitHub에 호스팅된 CPython 저장소로 이동해야 합니다.

그런 다음 아래 단계를 따라야 합니다:

  1. codespace 실행하기

    • , 키를 눌러 현재 브랜치의 codespace 설정 화면을 여십시오

      • 기본 개발 컨테이너를 사용하려면(대부분 이것을 원할 것입니다) 녹색 Create new codespace 버튼을 클릭하십시오

      • 다른 컨테이너를 사용하려면 Change options를 클릭하고 알맞은 컨테이너를 선택하십시오

    • 또는 녹색 Code 버튼을 클릭하고 codespaces 탭을 선택하십시오

      • 기본 개발 컨테이너를 사용하려면(대부분 이것을 원할 것입니다) 녹색 Create codespace on main 버튼을 클릭하십시오

      • 다른 컨테이너를 사용하려면 … 메뉴로 이동하여 New with options…를 선택하십시오

  2. codespace를 설정하고 있음을 알리는 화면이 나타납니다. (참고: CPython devcontainer가 제공되므로 codespace는 거기에 지정된 구성을 사용합니다.)

  3. VS Code 웹 버전이 웹 브라우저 안에서 열립니다. 이 웹 버전은 여러분의 코드와 이미 연결되어 있고, CPython과 그 문서가 이미 빌드된 원격 코드스페이스의 터미널에도 연결되어 있습니다.

  4. 준비가 되면 터미널에서 평소처럼 Git 명령을 사용하여 새 브랜치를 만들고, 변경 사항을 커밋하고 푸시하십시오!

저장소를 닫았다가 나중에 다시 돌아오더라도, CPython 저장소로 이동하여 codespaces 탭을 선택하고 가장 최근의 코드스페이스 세션을 선택하면 언제든지 코드스페이스를 재개할 수 있습니다. 그러면 중단했던 곳에서 이어서 작업할 수 있습니다!

로컬에서 Codespaces 사용하기

코드스페이스 화면의 왼쪽 아래에 Codespaces라고 적힌 초록색 또는 회색 사각형이 보입니다. 이것을 클릭하면 추가 옵션을 볼 수 있습니다. 로컬에 설치된 VS Code에서 작업하는 것을 선호한다면 Open in VS Code 옵션을 선택할 수 있습니다. 이 경우에도 여전히 원격 코드스페이스 인스턴스에서 작업하므로, 원격 인스턴스의 컴퓨팅 성능을 사용하게 됩니다. 이 컴퓨팅 성능은 로컬 컴퓨터보다 사양이 훨씬 높을 수 있으므로 도움이 될 수 있습니다.

개발 컨테이너 직접 사용하기

환경을 더 세밀하게 제어하고 싶거나 오프라인으로 작업하고 싶다면, GitHub Codespaces에서 사용하는 것과 같은 컨테이너를 직접 사용할 수 있습니다. 이 방법은 컨테이너를 다뤄 본 경험이 있는(또는 경험을 쌓고 싶은) 사용자를 위한 것입니다. 이 안내는 Docker 또는 Podman이 설치된 Unix 계열 환경을 전제로 합니다. 또한 이 안내는 기본 개발 컨테이너를 사용한다고 가정합니다. 다른 컨테이너(예: WASI 개발 컨테이너)를 사용하려면 명령을 적절히 수정하십시오.

미리 빌드된 컨테이너 이미지 사용하기

개발 컨테이너 이미지는 Python 조직의 GitHub Container Registry(GHCR) 계정에서 받을 수 있습니다.

컨테이너를 실행하고 Bash 셸을 시작하려면, CPython 저장소의 클론에서 다음 명령 중 하나를 실행하십시오.

podman run -it --rm --volume $PWD:/workspace:Z --workdir /workspace ghcr.io/python/devcontainer:latest
docker run -it --rm --volume $PWD:/workspace --workdir /workspace ghcr.io/python/devcontainer:latest

컨테이너에는 작업 디렉터리에 대한 읽기/쓰기 권한이 있다는 점에 유의하십시오. 별도의 CPython 클론을 사용하거나, make clean을 실행하여 호스트 OS용으로 생성된 캐시와 빌드 결과물을 제거하는 것이 좋습니다.

직접 빌드하기

원한다면 컨테이너 이미지를 직접 빌드할 수 있습니다. cpython-devcontainers repo의 클론에서 컨테이너를 빌드하고 이름을 cpython-dev로 지정하십시오:

podman build devcontainer/ --tag cpython-dev
docker build devcontainer/ --tag cpython-dev

기존 cpython-dev 컨테이너가 있으면 같은 명령으로 업데이트됩니다. 이 명령을 가끔씩 다시 실행하십시오. 특히 컨테이너가 제대로 작동하지 않을 때는 꼭 다시 실행하십시오.

컨테이너를 실행하고 Bash 셸을 시작하려면, CPython 저장소의 클론에서 다음 명령 중 하나를 실행하십시오.

podman run -it --rm --volume $PWD:/workspace:Z --workdir /workspace cpython-dev bash
docker run -it --rm --volume $PWD:/workspace --workdir /workspace cpython-dev bash

GHCR의 컨테이너 이미지로 실행할 때에 대해 위에서 설명한 주의 사항이 여기에도 똑같이 적용됩니다.