sysconfig — Python의 구성 정보 접근
sysconfig — Python의 구성 정보 접근
버전 3.2에 추가됨.
sysconfig 모듈은 설치 경로 목록과 현재 플랫폼에 관련된 구성 변수 같은 Python의 구성 정보에 접근할 수 있게 해줘요.
출처: Python 표준 라이브러리
본문
구성 변수
Python 배포판에는 Python 바이너리 자체와 setuptools로 컴파일되는 서드파티 C 확장을 빌드하는 데 필요한 Makefile과 pyconfig.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설치 스킴에서 경로 이름에 대응하는 설치 경로를 반환해요.name은get_path_names()가 반환한 목록의 값이어야 해요.sysconfig는 각 플랫폼에 대해 경로 이름별 설치 경로를 확장할 변수와 함께 저장해요. 예를 들어 nt 스킴의 stdlib 경로는{base}/Lib이에요.get_path()는get_config_vars()가 반환한 변수들로 경로를 확장해요. 모든 변수는 각 플랫폼에 대한 기본값이 있어서 이 함수를 호출하면 기본값을 얻을 수 있어요.scheme이 주어지면get_scheme_names()이 반환한 목록의 값이어야 해요. 그렇지 않으면 현재 플랫폼의 기본 스킴이 사용돼요.vars가 주어지면get_config_vars()가 반환한 사전을 갱신할 변수 사전이어야 해요.expand가False로 설정되면 경로가 변수로 확장되지 않아요.name이 없으면KeyError를 발생시켜요.sysconfig.get_paths([scheme[, vars[, expand]]])— 설치 스킴에 대응하는 모든 설치 경로를 담은 사전을 반환해요. 자세한 내용은get_path()를 보세요.scheme이 제공되지 않으면 현재 플랫폼의 기본 스킴을 사용해요.vars가 주어지면 경로 확장에 쓰이는 사전을 갱신할 변수 사전이어야 해요.expand가 false로 설정되면 경로가 확장되지 않아요.scheme이 기존 스킴이 아니면get_paths()가KeyError를 발생시켜요.
기타 함수
-
sysconfig.get_python_version()—MAJOR.MINORPython 버전 번호를 문자열로 반환해요.'%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만 반환.
- Windows:
-
sysconfig.is_python_build()— 실행 중인 Python 인터프리터가 소스에서 빌드되어 그 빌드 위치에서 실행 중이면True를 반환해요.make install을 실행하거나 바이너리 설치 프로그램으로 설치해 생긴 위치에서 실행되는 것이 아니라요. -
sysconfig.parse_config_h(fp[, vars])—config.h-스타일 파일을 파싱해요.fp는config.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()가 반환한 정보를 인쇄해요.