sysconfig — Python의 구성 정보 접근

sysconfig — Python의 구성 정보 접근

버전 3.2에 추가됨.

sysconfig 모듈은 설치 경로 목록과 현재 플랫폼에 관련된 구성 변수 같은 Python의 구성 정보에 접근할 수 있게 해줘요.

출처: Python 표준 라이브러리

본문

구성 변수

Python 배포판에는 Python 바이너리 자체와 setuptools로 컴파일되는 서드파티 C 확장을 빌드하는 데 필요한 Makefilepyconfig.h 헤더 파일이 포함돼요.

sysconfig는 이 파일들에서 찾은 모든 변수를 get_config_vars()get_config_var()로 접근할 수 있는 사전에 넣어요. Windows에서는 훨씬 작은 집합이라는 점을 주의하세요.

s sysconfig.get_config_vars(*args) — 인자 없이 호출하면 현재 플랫폼에 관련된 모든 구성 변수의 사전을 반환해요. 인자와 함께 호출하면 구성 변수 사전에서 각 인자를 조회한 결과인 값들의 목록을 반환해요. 각 인자에 대해 값이 없으면 None을 반환해요.

s sysconfig.get_config_var(name) — 단일 변수 이름의 값을 반환해요. get_config_vars().get(name)과 동등해요. name이 없으면 None을 반환해요.

사용 예:

>>> import sysconfig
>>> sysconfig.get_config_var('Py_ENABLE_SHARED')
0
>>> sysconfig.get_config_var('LIBDIR')
'/usr/local/lib'
>>> sysconfig.get_config_vars('AR', 'CXX')
['ar', 'g++']

설치 경로

Python은 플랫폼과 설치 옵션에 따라 다른 설치 스킴(scheme)을 사용해요. 이 스킴들은 os.name이 반환하는 값을 기준으로 한 고유 식별자 아래 sysconfig에 저장돼요. 스킴들은 패키지 설치 프로그램이 파일을 어디에 복사할지 결정하는 데 쓰여요.

Python은 현재 아홉 가지 스킴을 지원해요:

  • posix_prefix: Linux나 macOS 같은 POSIX 플랫폼용 스킴. Python이나 구성 요소를 설치할 때 쓰이는 기본 스킴이에요.
  • posix_home: home 옵션을 쓸 때의 POSIX 플랫폼용 스킴. 특정 home 접두사 아래에 있는 경로들을 정의해요.
  • posix_user: user 옵션을 쓸 때의 POSIX 플랫폼용 스킴. 사용자 홈 디렉터리(site.USER_BASE) 아래에 있는 경로들을 정의해요.
  • posix_venv: POSIX 플랫폼의 Python 가상 환경용 스킴. 기본적으로 posix_prefix와 같아요.
  • nt: Windows용 스킴. Python이나 구성 요소를 설치할 때 쓰이는 기본 스킴이에요.
  • nt_user: user 옵션을 쓸 때의 Windows용 스킴.
  • nt_venv: Windows의 Python 가상 환경용 스킴. 기본적으로 nt와 같아요.
  • venv: Python이 실행되는 플랫폼에 따라 posix_venv 또는 nt_venv의 값을 취하는 스킴.
  • osx_framework_user: user 옵션을 쓸 때의 macOS용 스킴.

각 스킴은 일련의 경로들로 구성되고 각 경로는 고유한 식별자를 가져요. Python은 현재 여덟 가지 경로를 사용해요:

  • stdlib: 플랫폼 특화되지 않은 표준 Python 라이브러리 파일을 담는 디렉터리.
  • platstdlib: 플랫폼 특화된 표준 Python 라이브러리 파일을 담는 디렉터리.
  • platlib: 사이트 특화, 플랫폼 특화 파일용 디렉터리.
  • purelib: 사이트 특화, 비-플랫폼 특화 파일('순수' Python)용 디렉터리.
  • include: Python C-API용 비-플랫폼 특화 헤더 파일 디렉터리.
  • platinclude: Python C-API용 플랫폼 특화 헤더 파일 디렉터리.
  • scripts: 스크립트 파일용 디렉터리.
  • data: 데이터 파일용 디렉터리.

User 스킴

이 스킴은 전역 site-packages 디렉터리에 쓰기 권한이 없거나 거기에 설치하고 싶지 않은 사용자에게 가장 편리한 해결책이 되도록 설계됐어요. 파일은 site.USER_BASE(이하 userbase로 표기)의 하위 디렉터리에 설치돼요. 이 스킴은 순수 Python 모듈과 확장 모듈을 같은 위치(또한 site.USER_SITE라고도 함)에 설치해요.

posix_user — stdlib: userbase/lib/pythonX.Y, platstdlib: userbase/lib/pythonX.Y, platlib: userbase/lib/pythonX.Y/site-packages, purelib: userbase/lib/pythonX.Y/site-packages, include: userbase/include/pythonX.Y, scripts: userbase/bin, data: userbase.

nt_user — stdlib: userbase\PythonXY, platstdlib: userbase\PythonXY, platlib: userbase\PythonXY\site-packages, purelib: userbase\PythonXY\site-packages, include: userbase\PythonXY\Include, scripts: userbase\PythonXY\Scripts, data: userbase.

osx_framework_user — stdlib: userbase/lib/python, platstdlib: userbase/lib/python, platlib: userbase/lib/python/site-packages, purelib: userbase/lib/python/site-packages, include: userbase/include/pythonX.Y, scripts: userbase/bin, data: userbase.

Home 스킴

"home 스킴"의 아이디어는 개인적인 Python 모듈 저장소(stash)를 만들고 유지한다는 거예요. 이 스킴의 이름은 Unix의 "home" 디렉터리 개념에서 유래했어요. Unix 사용자가 자기 홈 디렉터리를 /usr//usr/local/과 비슷한 레이아웃으로 만드는 건 드물지 않으니까요. 이 스킴은 설치 대상 운영체제와 무관하게 누구나 쓸 수 있어요.

posix_home — stdlib: home/lib/python, platstdlib: home/lib/python, platlib: home/lib/python, purelib: home/lib/python, include: home/include/python, platinclude: home/include/python, scripts: home/bin, data: home.

Prefix 스킴

"prefix 스킴"은 하나의 Python 설치로 빌드/설치(즉 setup 스크립트 실행)를 수행하면서도, 다른 Python 설치(또는 그렇게 보이는 것)의 서드파티 모듈 디렉터리에 모듈을 설치하고 싶을 때 유용해요. 조금 이상하게 들린다면, 실제로 그래요 — 그래서 user와 home 스킴이 앞서 나온 거죠. 다만 prefix 스킴이 유용한 알려진 경우가 적어도 두 가지 있어요.

먼저, 많은 Linux 배포판이 Python을 더 전통적인 /usr/local 대신 /usr에 둔다는 점을 생각해요. 그런 경우 Python이 로컬 부가물이 아니라 "시스템"의 일부이므로 완전히 적절해요. 하지만 소스에서 Python 모듈을 설치한다면 /usr/lib/python2.X보다 /usr/local/lib/python2.X에 넣고 싶을 거예요.

또 하나는 원격 디렉터리에 쓸 때 쓰는 이름이 읽을 때 쓰는 이름과 다른 네트워크 파일 시스템이에요. 예를 들어 /usr/local/bin/python으로 접근되는 Python 인터프리터가 /usr/local/lib/python2.X에서 모듈을 찾는다면, 그 모듈들은 예를 들어 /mnt/@server/export/lib/python2.X에 설치돼야 해요.

posix_prefix — stdlib: prefix/lib/pythonX.Y, platstdlib: prefix/lib/pythonX.Y, platlib: prefix/lib/pythonX.Y/site-packages, purelib: prefix/lib/pythonX.Y/site-packages, include: prefix/include/pythonX.Y, platinclude: prefix/include/pythonX.Y, scripts: prefix/bin, data: prefix.

nt — stdlib: prefix\Lib, platstdlib: prefix\Lib, platlib: prefix\Lib\site-packages, purelib: prefix\Lib\site-packages, include: prefix\Include, platinclude: prefix\Include, scripts: prefix\Scripts, data: prefix.

설치 경로 함수

sysconfig는 이 설치 경로들을 결정하는 몇 가지 함수를 제공해요.

  • sysconfig.get_scheme_names()sysconfig에서 현재 지원되는 모든 스킴을 담은 튜플을 반환해요.
  • sysconfig.get_default_scheme() — 현재 플랫폼의 기본 스킴 이름을 반환해요. 버전 3.10에서 추가: 이 함수는 이전에 _get_default_scheme()으로 불렸고 구현 세부사항으로 간주됐어요. 버전 3.11에서 변경: Python이 가상 환경에서 실행되면 venv 스킴을 반환함.
  • sysconfig.get_preferred_scheme(key)key가 지정하는 설치 레이아웃에 대한 선호 스킴 이름을 반환해요. key"prefix", "home", "user" 중 하나여야 해요. 반환 값은 get_scheme_names()에 나열된 스킴 이름이에요. get_paths()처럼 스킴 인자를 받는 sysconfig 함수에 전달할 수 있어요. 버전 3.10에서 추가. 버전 3.11에서 변경: Python이 가상 환경에서 실행되고 key="prefix"일 때 venv 스킴을 반환함.
  • sysconfig._get_preferred_schemes() — 현재 플랫폼의 선호 스킴 이름을 담은 dict를 반환해요. Python 구현자와 재배포자는 _INSTALL_SCHEMES 모듈-레벨 전역 값에 선호 스킴을 추가하고, 이 함수를 수정해 그 스킴 이름을 반환할 수 있어요. 예를 들어 시스템과 언어 패키지 매니저가 서로 다른 스킴을 사용해, 어느 한쪽이 설치한 패키지가 다른 쪽 것과 섞이지 않게 할 수 있죠. 최종 사용자는 이 함수 대신 get_default_scheme()get_preferred_scheme()을 써야 해요. (버전 3.10에 추가됨.)
  • sysconfig.get_path_names()sysconfig에서 현재 지원되는 모든 경로 이름을 담은 튜플을 반환해요.
  • sysconfig.get_path(name[, scheme[, vars[, expand]]])scheme 설치 스킴에서 경로 이름에 대응하는 설치 경로를 반환해요. nameget_path_names()가 반환한 목록의 값이어야 해요. sysconfig는 각 플랫폼에 대해 경로 이름별 설치 경로를 확장할 변수와 함께 저장해요. 예를 들어 nt 스킴의 stdlib 경로는 {base}/Lib이에요. get_path()get_config_vars()가 반환한 변수들로 경로를 확장해요. 모든 변수는 각 플랫폼에 대한 기본값이 있어서 이 함수를 호출하면 기본값을 얻을 수 있어요. scheme이 주어지면 get_scheme_names()이 반환한 목록의 값이어야 해요. 그렇지 않으면 현재 플랫폼의 기본 스킴이 사용돼요. vars가 주어지면 get_config_vars()가 반환한 사전을 갱신할 변수 사전이어야 해요. expandFalse로 설정되면 경로가 변수로 확장되지 않아요. name이 없으면 KeyError를 발생시켜요.
  • sysconfig.get_paths([scheme[, vars[, expand]]]) — 설치 스킴에 대응하는 모든 설치 경로를 담은 사전을 반환해요. 자세한 내용은 get_path()를 보세요. scheme이 제공되지 않으면 현재 플랫폼의 기본 스킴을 사용해요. vars가 주어지면 경로 확장에 쓰이는 사전을 갱신할 변수 사전이어야 해요. expand가 false로 설정되면 경로가 확장되지 않아요. scheme이 기존 스킴이 아니면 get_paths()KeyError를 발생시켜요.

기타 함수

  • sysconfig.get_python_version()MAJOR.MINOR Python 버전 번호를 문자열로 반환해요. '%d.%d' % sys.version_info[:2]와 비슷해요.

  • sysconfig.get_platform() — 현재 플랫폼을 식별하는 문자열을 반환해요. 주로 플랫폼 특화 빌드 디렉터리와 플랫폼 특화 빌드 배포판을 구분하는 데 쓰여요. 일반적으로 OS 이름과 버전, 아키텍처(os.uname()이 제공)를 포함하지만, 정확한 정보는 OS에 따라 달라요. 예를 들어 Linux에서 커널 버전은 별로 중요하지 않아요.

    반환 값의 예:

    • Windows: win-amd64(AMD64 즉 x86_64, Intel64, EM64T의 64비트 Windows), win-arm64(ARM64 즉 AArch64의 64비트 Windows), win32(그 외 전부 — 구체적으로 sys.platform이 반환됨).
    • POSIX 기반 OS: linux-x86_64, macosx-15.5-arm64, macosx-26.0-universal2(Apple Silicon 또는 Intel의 macOS), android-24-arm64_v8a.
    • 다른 비-POSIX 플랫폼: 현재는 sys.platform만 반환.
  • sysconfig.is_python_build() — 실행 중인 Python 인터프리터가 소스에서 빌드되어 그 빌드 위치에서 실행 중이면 True를 반환해요. make install을 실행하거나 바이너리 설치 프로그램으로 설치해 생긴 위치에서 실행되는 것이 아니라요.

  • sysconfig.parse_config_h(fp[, vars])config.h-스타일 파일을 파싱해요. fpconfig.h-류 파일을 가리키는 파일류 객체예요. 이름/값 쌍을 담은 사전이 반환돼요. 선택적 사전이 두 번째 인자로 전달되면 새 사전 대신 그것이 사용되고, 파일에서 읽은 값으로 갱신돼요.

  • sysconfig.get_config_h_filename()pyconfig.h의 경로를 반환해요.

  • sysconfig.get_makefile_filename()Makefile의 경로를 반환해요.

명령줄 사용

Python의 -m 옵션으로 sysconfig를 스크립트로 쓸 수 있어요:

$ python -m sysconfig
Platform: "macosx-10.4-i386"
Python version: "3.2"
Current installation scheme: "posix_prefix"

Paths:
        data = "/usr/local"
        include = "/Users/tarek/Dev/svn.python.org/py3k/Include"
        platinclude = "."
        platlib = "/usr/local/lib/python3.2/site-packages"
        platstdlib = "/usr/local/lib/python3.2"
        purelib = "/usr/local/lib/python3.2/site-packages"
        scripts = "/usr/local/bin"
        stdlib = "/usr/local/lib/python3.2"

Variables:
        AC_APPLE_UNIVERSAL_BUILD = "0"
        AIX_GENUINE_CPLUSPLUS = "0"
        AR = "ar"
        ARFLAGS = "rc"
        ...

이 호출은 표준 출력에 get_platform(), get_python_version(), get_path(), get_config_vars()가 반환한 정보를 인쇄해요.