Python

인터프리터 초기화 및 파이널리제이션

초기화 전에 인터프리터를 구성하는 방법에 대한 자세한 내용은 Python Initialization Configuration 를 참조하십시오.

파이썬 초기화 전

파이썬을 임베딩하는 응용 프로그램에서는 다른 파이썬/C API 함수를 사용하기 전에 Py_Initialize() 함수를 호출해야 합니다. 단, 몇 가지 함수와 global configuration variables 는 예외입니다.

다음 함수들은 파이썬이 초기화되기 전에 안전하게 호출될 수 있습니다:

참고

위에 나열된 일부 함수들과 겉보기에 유사함에도 불구하고, 다음 함수들은 인터프리터가 초기화되기 전에 호출해서는 안 됩니다: Py_EncodeLocale(), PyEval_InitThreads(), 그리고 Py_RunMain().

전역 구성 변수

Python은 다양한 기능과 옵션을 제어하기 위한 전역 구성 변수를 가지고 있습니다. 기본적으로 이 플래그들은 명령 줄 옵션 에 의해 제어됩니다.

옵션에 의해 플래그가 설정될 때, 해당 플래그의 값은 옵션이 설정된 횟수를 나타냅니다. 예를 들어, -bPy_BytesWarningFlag 를 1로 설정하고 -bbPy_BytesWarningFlag 를 2로 설정합니다.

int Py_BytesWarningFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.bytes_warning 을 설정해야 하며, 자세한 내용은 Python 초기화 구성 을 참조하십시오.

Issue a warning when comparing bytes or bytearray with str or bytes with int. Issue an error if greater or equal to 2.

-b 옵션에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_DebugFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.parser_debug 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

파서 디버깅 출력을 활성화합니다. (전문가용이며, 컴파일 옵션에 따라 달라질 수 있습니다.)

-d 옵션과 PYTHONDEBUG 환경 변수에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_DontWriteBytecodeFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.write_bytecode 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

이 값이 0이 아닌 경우, Python은 소스 모듈을 임포트할 때 .pyc 파일을 작성하려 시도하지 않습니다.

-B 옵션과 PYTHONDONTWRITEBYTECODE 환경 변수에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_FrozenFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.pathconfig_warnings 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

_freeze_modulefrozenmain 프로그램에서 사용되는 비공개 플래그입니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_HashRandomizationFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.hash_seedPyConfig.use_hash_seed 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

PYTHONHASHSEED 환경 변수가 비어 있지 않은 문자열로 설정된 경우 1 로 설정됩니다.

플래그가 0이 아닌 경우, 비밀 해시 시드를 초기화하기 위해 PYTHONHASHSEED 환경 변수를 읽습니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_IgnoreEnvironmentFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.use_environment 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

설정되었을 수 있는 모든 PYTHON* 환경 변수(예: PYTHONPATH, PYTHONHOME)를 무시합니다.

-E-I 옵션에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_InspectFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.inspect 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

스크립트가 첫 번째 인자로 전달되거나 -c 옵션이 사용되는 경우, sys.stdin 이 터미널로 보이지 않더라도 스크립트나 명령 실행 후 대화형 모드로 진입합니다.

-i 옵션과 PYTHONINSPECT 환경 변수에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_InteractiveFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.interactive 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

-i 옵션에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_IsolatedFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.isolated 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

Python을 격리 모드(isolated mode)로 실행합니다. 격리 모드에서 sys.path 는 스크립트 디렉터리와 사용자의 site-packages 디렉터리를 모두 포함하지 않습니다.

-I 옵션에 의해 설정됩니다.

Added in version 3.4.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_LegacyWindowsFSEncodingFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyPreConfig.legacy_windows_fs_encoding 을 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

If the flag is non-zero, use the mbcs encoding with replace error handler, instead of the UTF-8 encoding with surrogatepass error handler, for the filesystem encoding and error handler.

PYTHONLEGACYWINDOWSFSENCODING 환경 변수가 비어 있지 않은 문자열로 설정된 경우 1 로 설정됩니다.

자세한 내용은 PEP 529 를 참조하십시오.

가용성: Windows.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_LegacyWindowsStdioFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.legacy_windows_stdio 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

플래그가 0이 아닌 경우, sys 표준 스트림에 대해 io._WindowsConsoleIO 대신 io.FileIO 를 사용합니다.

PYTHONLEGACYWINDOWSSTDIO 환경 변수가 비어 있지 않은 문자열로 설정된 경우 1 로 설정됩니다.

자세한 내용은 PEP 528 을 참조하십시오.

가용성: Windows.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_NoSiteFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.site_import 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

site 모듈의 임포트와 그로 인해 발생하는 sys.path 의 사이트 의존적 조작을 비활성화합니다. 또한, 나중에 site 가 명시적으로 임포트되더라도 이러한 조작을 비활성화합니다(이러한 조작이 트리거되기를 원하면 site.main() 을 호출하십시오).

-S 옵션에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_NoUserSiteDirectory

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.user_site_directory 를 설정해야 하며, 자세한 내용은 Python 초기화 구성 를 참조하십시오.

사용자 site-packages 디렉터리sys.path 에 추가하지 않습니다.

-s-I 옵션과 PYTHONNOUSERSITE 환경 변수에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_OptimizeFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.optimization_level 을 설정해야 하며, 자세한 내용은 Python Initialization Configuration 를 참조하십시오.

-O 옵션과 PYTHONOPTIMIZE 환경 변수에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_QuietFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.quiet 를 설정해야 하며, 자세한 내용은 Python Initialization Configuration 를 참조하십시오.

대화형 모드에서도 저작권 및 버전 메시지를 표시하지 않습니다.

-q 옵션에 의해 설정됩니다.

Added in version 3.2.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_UnbufferedStdioFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.buffered_stdio 를 설정해야 하며, 자세한 내용은 Python Initialization Configuration 를 참조하십시오.

stdout 및 stderr 스트림을 버퍼링하지 않도록 강제합니다.

-u 옵션과 PYTHONUNBUFFERED 환경 변수에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

int Py_VerboseFlag

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.verbose 를 설정해야 하며, 자세한 내용은 Python Initialization Configuration 를 참조하십시오.

모듈이 초기화될 때마다 로드된 위치(파일명 또는 내장 모듈)를 표시하는 메시지를 출력합니다. 값이 2 이상이면 모듈을 검색할 때 확인되는 각 파일에 대한 메시지를 출력합니다. 또한 종료 시 모듈 정리에 대한 정보를 제공합니다.

-v 옵션과 PYTHONVERBOSE 환경 변수에 의해 설정됩니다.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

인터프리터 초기화 및 종료

void Py_Initialize()
…의 일부 안정 ABI.

Python 인터프리터를 초기화합니다. Python을 내장하는 응용 프로그램에서는 다른 Python/C API 함수를 사용하기 전에 이 함수를 호출해야 합니다. 몇 가지 예외 사항은 Before Python Initialization 를 참조하십시오.

이 함수는 로드된 모듈 테이블(sys.modules)을 초기화하고, 핵심 모듈인 builtins, __main__, 그리고 sys 를 생성합니다. 또한 모듈 검색 경로(sys.path)를 초기화합니다. sys.argv 는 설정하지 않으므로 이를 위해서는 Python Initialization Configuration API를 사용하십시오. 이 함수는 처음으로 호출될 때만 동작하며, 두 번째 호출 시에는 아무 작업도 수행하지 않습니다(먼저 Py_FinalizeEx() 를 호출하지 않은 경우). 반환 값이 없으며, 초기화에 실패하면 치명적 오류가 발생합니다.

Python Initialization Configuration 를 사용자 정의하려면 Py_InitializeFromConfig() 를 사용하십시오.

참고

Windows에서 콘솔 모드를 O_TEXT 에서 O_BINARY 로 변경하며, 이는 C Runtime을 사용하는 다른 비(非) Python용 콘솔 사용에도 영향을 미칩니다.

void Py_InitializeEx(int initsigs)
…의 일부 안정 ABI.

initsigs1 이면 이 함수는 Py_Initialize() 와 동일하게 작동합니다. initsigs0 인 경우 신호 처리기(signal handler)의 초기화 등록을 건너뛰며, 이는 CPython이 더 큰 응용 프로그램의 일부로 내장될 때 유용할 수 있습니다.

Python Initialization Configuration 를 사용자 정의하려면 Py_InitializeFromConfig() 를 사용하십시오.

PyStatus Py_InitializeFromConfig(const PyConfig *config)

PyConfig를 사용한 초기화 에 설명된 대로 config 구성에서 Python을 초기화합니다.

인터프리터 사전 초기화, 실행 시간 구성 구조체 채우기 및 반환된 상태 구조체 쿼리에 대한 자세한 내용은 파이썬 초기화 구성 섹션을 참조하십시오.

int Py_IsInitialized()
…의 일부 안정 ABI.

Python 인터프리터가 초기화된 경우 참(0이 아닌 값)을 반환하고, 그렇지 않은 경우 거짓(0)을 반환합니다. Py_FinalizeEx() 가 호출된 후에는 Py_Initialize() 가 다시 호출될 때까지 거짓을 반환합니다.

버전 3.15에서 변경: 이 함수는 이제 site 모듈을 포함한 모든 초기화가 완료될 때까지 참을 반환하지 않습니다. 이전에는 Py_Initialize() 가 실행 중인 동안에도 참을 반환할 수 있었습니다.

int Py_IsFinalizing()
…의 일부 안정 ABI 버전 3.13 이후로.

메인 Python 인터프리터가 종료 중이면 참(0이 아닌 값)을 반환합니다. 그렇지 않으면 거짓(0)을 반환합니다.

Added in version 3.13.

int Py_FinalizeEx()
…의 일부 안정 ABI 버전 3.6 이후로.

Py_Initialize() 및 이후의 Python/C API 함수 사용으로 수행된 모든 초기화 작업을 취소하고, 마지막 Py_Initialize() 호출 이후 생성되었으나 아직 파괴되지 않은 모든 하위 인터프리터(아래의 Py_NewInterpreter() 참조)를 제거합니다. 이 함수는 두 번째 호출 시(먼저 Py_Initialize() 를 호출하지 않은 경우) 아무 작업도 수행하지 않습니다.

이 함수는 Py_Initialize() 의 역과정이므로 동일한 스레드에서 동일한 인터프리터가 활성화된 상태로 호출되어야 합니다. 즉, 메인 스레드와 메인 인터프리터여야 합니다. 이 함수는 Py_RunMain() 이 실행되는 동안 절대로 호출되어서는 안 됩니다.

일반적으로 반환 값은 0 입니다. 종료 과정(버퍼된 데이터 플러시) 중 오류가 발생하면 -1 이 반환됩니다.

Python은 인터프리터에 의해 할당된 모든 메모리를 해제하기 위해 최선을 다합니다. 따라서 C 확장 모듈은 다음 Py_Initialize() 호출에서 이들을 사용하기 전에 이전에 할당된 모든 PyObject를 올바르게 정리해야 합니다. 그렇지 않으면 보안 취약점이나 잘못된 동작이 발생할 수 있습니다.

이 함수는 여러 가지 이유로 제공됩니다. 임베딩 애플리케이션은 애플리케이션 자체를 재시작하지 않고도 파이썬을 재시작하고 싶어 할 수 있습니다. 동적으로 로드 가능한 라이브러리(또는 DLL)에서 파이썬 인터프리터를 로드한 애플리케이션은 DLL을 언로드하기 전에 파이썬에 의해 할당된 모든 메모리를 해제하고 싶어 할 수도 있습니다. 애플리케이션의 메모리 누수를 추적하는 동안 개발자는 애플리케이션에서 나가기 전에 파이썬에 의해 할당된 모든 메모리를 해제하고자 할 수 있습니다.

버그 및 주의사항: 모듈 및 모듈 내 객체의 파괴는 무작위 순서로 수행됩니다. 이로 인해 다른 객체(함수 포함)나 모듈에 의존하는 소멸자(__del__() 메서드)가 실패할 수 있습니다. 파이썬에 의해 로드된 동적 확장 모듈은 언로드되지 않습니다. 파이썬 인터프리터에 의해 할당된 적은 양의 메모리는 해제되지 않을 수 있습니다(누수를 발견하면 보고해 주십시오). 객체 간의 순환 참조에 묶인 메모리는 해제되지 않습니다. 인턴된 문자열은 참조 횟수와 상관없이 모두 해제됩니다. 확장 모듈에 의해 할당된 일부 메모리는 해제되지 않을 수 있습니다. 초기화 루틴이 여러 번 호출되는 경우 일부 확장이 제대로 작동하지 않을 수 있으며, 이는 애플리케이션이 Py_Initialize()Py_FinalizeEx() 를 여러 번 호출할 때 발생할 수 있습니다. Py_FinalizeEx() 는 자체 내에서 재귀적으로 호출되어서는 안 됩니다. 따라서 인터프리터 종료 과정의 일부로 실행될 수 있는 코드(예: atexit 핸들러, 객체 파이널라이저 또는 stdout 및 stderr 파일을 플러시하는 동안 실행될 수 있는 모든 코드)에 의해 호출되어서는 안 됩니다.

인자 없이 감사 이벤트 cpython._PySys_ClearAuditHooks 를 발생시킵니다.

Added in version 3.6.

void Py_Finalize()
…의 일부 안정 ABI.

이것은 반환 값을 무시하는 Py_FinalizeEx() 의 하위 호환 버전입니다.

int Py_BytesMain(int argc, char **argv)
…의 일부 안정 ABI 버전 3.8 이후로.

Py_Main() 과 유사하지만 argv 가 바이트 문자열 배열이므로 호출하는 애플리케이션이 텍스트 디코딩 단계를 CPython 런타임에 위임할 수 있습니다.

Added in version 3.8.

int Py_Main(int argc, wchar_t **argv)
…의 일부 안정 ABI.

표준 인터프리터를 위한 메인 프로그램으로, 전체 초기화/파이널리제이션 사이클을 캡슐화하며 환경 및 명령줄에서 구성 설정을 읽어온 후 명령 줄 에 따라 __main__ 을 실행하는 추가 동작을 포함합니다.

이 기능은 단순히 더 큰 애플리케이션에 파이썬 런타임을 내장하는 대신 전체 CPython 명령줄 인터페이스를 지원하려는 프로그램을 위해 제공됩니다.

argcargv 매개변수는 C 프로그램의 main() 함수에 전달되는 것과 유사하지만, 차이점은 argv 항목이 먼저 Py_DecodeLocale() 를 사용하여 wchar_t 로 변환된다는 것입니다. 또한 인자 목록의 항목이 입력된 것과 다른 문자열을 가리키도록 변경될 수 있음에 유의하십시오(단, 인자 목록이 가리키는 문자열의 내용은 변경되지 않습니다).

인수 목록이 유효한 파이썬 명령줄을 나타내지 않으면 반환 값은 2 이며, 그렇지 않으면 Py_RunMain() 과 동일합니다.

런타임 구성 섹션에 설명된 CPython 런타임 구성 API 관점에서(오류 처리를 제외하고), Py_Main 은 대략 다음과 동일합니다:

PyConfig config;
PyConfig_InitPythonConfig(&config);
PyConfig_SetArgv(&config, argc, argv);
Py_InitializeFromConfig(&config);
PyConfig_Clear(&config);

Py_RunMain();

일반적인 사용 사례에서 임베딩 애플리케이션은 Py_Initialize(), Py_InitializeEx() 또는 Py_InitializeFromConfig() 를 직접 호출하는 대신 이 함수를 호출하며, 모든 설정은 본 문서의 다른 부분에 설명된 대로 적용됩니다. 만약 이전 런타임 초기화 API 호출 후에 이 함수가 호출되는 경우, 어떤 환경 및 명령줄 구성 설정이 업데이트될지는 버전에 따라 다릅니다(이는 런타임이 처음 초기화될 때 한 번 설정된 후 수정되는 것을 지원하는 설정에 따라 달라지기 때문입니다).

int Py_RunMain(void)

완전히 구성된 CPython 런타임에서 메인 모듈을 실행합니다.

명령 줄이나 구성에서 지정된 명령 (PyConfig.run_command), 스크립트 (PyConfig.run_filename) 또는 모듈 (PyConfig.run_module)을 실행합니다. 이러한 값이 모두 설정되지 않은 경우, __main__ 모듈의 전역 네임스페이스를 사용하는 대화형 파이썬 프롬프트(REPL)를 실행합니다.

PyConfig.inspect 가 설정되지 않은 경우(기본값), 인터프리터가 정상적으로 종료되면(즉, 예외를 발생시키지 않음) 반환 값은 0 이며, 처리되지 않은 SystemExit 의 경우 종료 상태를, 그 외 모든 처리되지 않은 예외에 대해서는 1 을 반환합니다.

PyConfig.inspect 가 설정된 경우(예를 들어 -i 옵션을 사용하는 경우), 인터프리터 종료 시 반환하는 대신 __main__ 모듈의 전역 네임스페이스를 사용하여 대화형 파이썬 프롬프트(REPL)에서 실행을 재개합니다. 인터프리터가 예외와 함께 종료된 경우, 해당 예외는 REPL 세션에서 즉시 발생됩니다. 함수 반환 값은 위에 명시된 대로 REPL 세션 이 종료되는 방식에 따라 0, 1 또는 SystemExit 의 상태로 결정됩니다.

이 함수는 반환하기 전에 항상 파이썬 인터프리터를 파이널리제이션합니다.

Py_RunMain() 을 사용하여 항상 격리 모드에서 실행되는 사용자 정의 파이썬의 예는 파이썬 구성 를 참조하십시오.

int PyUnstable_AtExit(PyInterpreterState *interp, void (*func)(void*), void *data)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

대상 인터프리터 interp 에 대한 atexit 콜백을 등록합니다. 이는 Py_AtExit() 와 유사하지만, 콜백을 위해 명시적인 인터프리터 및 데이터 포인터를 받습니다.

interpattached thread state 가 존재해야 합니다.

Added in version 3.13.

인터프리터 파이널리제이션 관련 주의사항

In the late stage of interpreter shutdown, after attempting to wait for non-daemon threads to exit (though this can be interrupted by KeyboardInterrupt) and running the atexit functions, the runtime is marked as finalizing, meaning that Py_IsFinalizing() and sys.is_finalizing() return true. At this point, only the finalization thread (the thread that initiated finalization; this is typically the main thread) is allowed to attach a thread state.

파이널리제이션 중에 명시적으로(예: PyThreadState_Ensure() 또는 Py_END_ALLOW_THREADS 를 통한 경우)나 암시적으로(예: 바이트코드 명령 사이 등) 연결을 시도하는 다른 스레드는 영구적으로 차단된 상태 에 빠지게 됩니다. 일반적으로 이는 무해하지만, 데드락을 초래할 수 있습니다. 예를 들어, 어떤 스레드가 잠금을 보유한 채 영구적으로 차단되면 파이널리제이션 스레드가 해당 잠금을 절대 획득할 수 없게 됩니다.

CPython 3.13 이전에는 스레드가 멈추는 대신 종료되었으며, 이는 다른 문제를 야기했습니다(PyThread_exit_thread() 의 경고 문구 참조).

심각한 문제인가요? 네. 파이썬 3.15부터는 파이널리제이션을 일시적으로 방지하여 이러한 문제를 피할 수 있게 하는 여러 C API가 제공됩니다.

더 보기

PEP 788 은 이들 API의 설계, 동기 및 근거를 설명합니다.

type PyInterpreterGuard
…의 일부 안정 ABI (불투명 구조체로) 버전 3.15 이후로.

불투명한 인터프리터 가드 구조체입니다.

인터프리터 가드를 보유함으로써 호출자는 가드가 닫힐 때까지( PyInterpreterGuard_Close() 를 통해) 인터프리터가 파이널리제이션되지 않도록 보장할 수 있습니다.

가드가 유지되는 동안 인터프리터를 파이널리제이션하려는 스레드는 가드가 닫힐 때까지 차단된 상태로 대기하며 그 이후에 파이널리제이션을 시작합니다. 파이널리제이션이 시작되면, 다른 스레드들은 해당 인터프리터에 대한 가드를 영원히 획득할 수 없습니다. 즉, 인터프리터 가드를 닫는 것을 잊으면 파이널리제이션 중에 프로세스가 영구적으로 멈출(hang) 수 있습니다!

Holding a guard for an interpreter is similar to holding a strong reference to a Python object, except finalization does not happen automatically after all guards are released: it requires an explicit Py_EndInterpreter() call.

Added in version 3.15.

PyInterpreterGuard *PyInterpreterGuard_FromCurrent(void)
…의 일부 안정 ABI 버전 3.15 이후로.

현재 인터프리터에 대한 파이널리제이션 가드를 생성합니다. 이 가드는 닫힐 때까지 파이널리제이션을 방지합니다.

예:

// 파이널리제이션을 일시적으로 방지합니다.
PyInterpreterGuard *guard = PyInterpreterGuard_FromCurrent();
if (guard == NULL) {
   // 파이널리제이션이 이미 시작되었거나 메모리가 부족한 상태입니다.
   return NULL;
}

Py_BEGIN_ALLOW_THREADS;
// 여기서 중요한 처리를 수행합니다. 예를 들어, 파이널리제이션 스레드에서 획득할 수 있는 잠금을 안전하게 확보할 수 있습니다.
Py_END_ALLOW_THREADS;

// 중요한 처리가 완료되었으므로, 이제 인터프리터는 다시 파이널리제이션을 진행할 수 있습니다.
PyInterpreterGuard_Close(guard);

성공하면 이 함수는 현재 인터프리터에 대한 가드를 반환하며, 실패 시 예외를 설정하고 NULL 을 반환합니다.

이 함수는 현재 인터프리터가 이미 파이널리제이션을 시작했거나 프로세스의 메모리가 부족한 경우에만 실패합니다.

이 함수가 반환한 가드 포인터는 반드시 나중에 PyInterpreterGuard_Close() 를 사용하여 닫아야 합니다. 그렇지 않으면 파이썬 프로세스가 무한히 대기하게 됩니다.

The caller must hold an attached thread state.

Added in version 3.15.

PyInterpreterGuard *PyInterpreterGuard_FromView(PyInterpreterView *view)
…의 일부 안정 ABI 버전 3.15 이후로.

뷰(view)를 통해 인터프리터에 대한 파이널리제이션 가드를 생성합니다.

성공하면 이 함수는 view 가 나타내는 인터프리터에 대한 가드를 반환합니다. 뷰는 이 함수를 호출한 후에도 유효합니다. 가드는 반드시 PyInterpreterGuard_Close() 로 닫혀야 합니다.

인터프리터가 더 이상 존재하지 않거나 파이널리제이션 중이거나 메모리가 부족한 경우, 이 함수는 예외를 설정하지 않고 NULL 을 반환합니다.

The caller does not need to hold an attached thread state.

Added in version 3.15.

void PyInterpreterGuard_Close(PyInterpreterGuard *guard)
…의 일부 안정 ABI 버전 3.15 이후로.

인터프리터 가드를 닫습니다. 다른 가드가 남아 있지 않은 상태에서 이 가드를 닫으면 인터프리터가 파이널리제이션을 시작할 수 있습니다. 만약 인터프리터 가드를 닫지 않으면, 인터프리터가 파이널리제이션에 진입하려고 할 때 무한히 대기하게 됩니다!

인터프리터 가드가 닫힌 후에는 PyThreadState_Ensure() 에서 사용할 수 없습니다. 그렇게 하면 정의되지 않은 동작이 발생합니다.

이 함수는 실패할 수 없으며, 호출자가 attached thread state 를 보유할 필요가 없습니다.

Added in version 3.15.

인터프리터 뷰

어떤 경우에는 이미 삭제된 인터프리터에 접근해야 할 수도 있습니다. 이는 인터프리터 뷰를 사용하여 수행할 수 있습니다.

type PyInterpreterView
…의 일부 안정 ABI (불투명 구조체로) 버전 3.15 이후로.

인터프리터의 불투명(opaque) 뷰입니다.

이는 파이널리제이션 중이거나 이미 파괴된 인터프리터에 접근하는 스레드 안전한(thread-safe) 방법입니다.

Added in version 3.15.

PyInterpreterView *PyInterpreterView_FromCurrent(void)
…의 일부 안정 ABI 버전 3.15 이후로.

현재 인터프리터에 대한 뷰를 생성합니다.

이 함수는 일반적으로 PyInterpreterGuard_FromView() 또는 PyThreadState_EnsureFromView() 와 함께 사용되도록 설계되었습니다.

성공 시 이 함수는 현재 인터프리터에 대한 뷰를 반환하며, 실패 시 예외를 설정하고 NULL 을 반환합니다.

The caller must hold an attached thread state.

Added in version 3.15.

void PyInterpreterView_Close(PyInterpreterView *view)
…의 일부 안정 ABI 버전 3.15 이후로.

인터프리터 뷰를 닫습니다.

인터프리터 뷰를 닫지 않으면 뷰의 메모리가 해제되지 않지만 다른 문제는 발생하지 않습니다. (이와 대조적으로, 가드를 닫지 않으면 파이널리제이션 동안 메인 스레드가 무한히 멈추게 됩니다.)

이 함수는 실패할 수 없으며, 호출자가 attached thread state 를 보유할 필요가 없습니다.

Added in version 3.15.

PyInterpreterView *PyInterpreterView_FromMain(void)
…의 일부 안정 ABI 버전 3.15 이후로.

메인 인터프리터(파이썬 프로세스에서 첫 번째이자 기본인 인터프리터; PyInterpreterState_Main() 참조)에 대한 뷰를 생성합니다.

성공 시 이 함수는 메인 인터프리터에 대한 뷰를 반환하며, 실패 시 예외 없이 NULL 을 반환합니다. 실패는 프로세스의 메모리가 부족함을 나타냅니다.

호출자가 인터프리터 포인터나 뷰를 제공할 수 없는 경우(예: 네이티브 스레딩 라이브러리가 PyInterpreterGuard 또는 PyInterpreterView 를 담을 수 있는 void *arg 매개변수를 제공하지 않는 경우) 이 함수를 사용하십시오. 서브 인터프리터를 지원하는 코드에서는 가드가 메인 인터프리터 대신 호출된 인터프리터를 추적할 수 있도록 PyInterpreterView_FromCurrent() 를 사용하는 것을 권장합니다.

The caller does not need to hold an attached thread state.

Added in version 3.15.

프로세스 전체 매개변수

void Py_SetProgramName(const wchar_t *name)
…의 일부 안정 ABI.

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.program_name 을 설정해야 하며, 자세한 내용은 파이썬 초기화 구성 을 참조하십시오.

이 함수는 호출될 경우 Py_Initialize() 가 처음으로 호출되기 전에 호출되어야 합니다. 이 함수는 인터프리터에 프로그램의 main() 함수에 대한 argv[0] 인자 값(와이드 문자로 변환됨)을 알려줍니다. 이는 아래의 다른 일부 함수들이 인터프리터 실행 파일과 관련된 파이썬 런타임 라이브러리를 찾는 데 사용됩니다. 기본값은 'python' 입니다. 인자는 프로그램 실행 동안 내용이 변경되지 않는 정적 저장소에 있는 0으로 끝나는 와이드 문자열을 가리켜야 합니다. 파이썬 인터프리터의 어떤 코드도 이 저장소의 내용을 변경하지 않습니다.

바이트열을 디코딩하여 wchar_t* 문자열을 얻으려면 Py_DecodeLocale() 을 사용하십시오.

버전 3.11부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

const char *Py_GetVersion()
…의 일부 안정 ABI.

이 파이썬 인터프리터의 버전을 반환합니다. 이 문자열은 다음과 같은 형식을 갖습니다.

"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \n[GCC 4.2.3]"

첫 번째 단어(첫 번째 공백 문자까지)는 현재 파이썬 버전이며, 첫 부분은 점으로 구분된 메이저 및 마이너 버전입니다. 반환된 문자열은 정적 저장소를 가리키므로 호출자가 그 값을 수정해서는 안 됩니다. 이 값은 파이썬 코드에서 sys.version 으로 사용할 수 있습니다.

Py_Version 상수를 참조하십시오.

const char *Py_GetPlatform()
…의 일부 안정 ABI.

현재 플랫폼의 식별자를 반환합니다. Unix에서 이는 운영체제의 “공식” 이름을 소문자로 변환하고 메이저 리비전 번호를 붙여 구성됩니다. 예를 들어, SunOS 5.x로도 알려진 Solaris 2.x의 경우 값은 'sunos5' 입니다. macOS에서는 'darwin' 이며, Windows에서는 'win' 입니다. 반환된 문자열은 정적 저장소를 가리키므로 호출자가 값을 수정해서 안 됩니다. 이 값은 파이썬 코드에서 sys.platform 으로 사용할 수 있습니다.

const char *Py_GetCopyright()
…의 일부 안정 ABI.

현재 파이썬 버전에 대한 공식 저작권 문구(예를 들어)

'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'

반환된 문자열은 정적 저장소를 가리키므로 호출자가 값을 수정해서는 안 됩니다. 이 값은 파이썬 코드에서 sys.copyright 로 사용할 수 있습니다.

const char *Py_GetCompiler()
…의 일부 안정 ABI.

현재 파이썬 버전을 빌드하는 데 사용된 컴파일러를 대괄호 안에 표시하여 반환합니다. 예를 들어:

"[GCC 2.7.2.2]"

반환된 문자열은 정적 저장소를 가리키므로 호출자가 값을 수정해서는 안 됩니다. 이 값은 파이썬 코드에서 변수 sys.version 의 일부로 제공됩니다.

const char *Py_GetBuildInfo()
…의 일부 안정 ABI.

현재 파이썬 인터프리터 인스턴스의 시퀀스 번호와 빌드 날짜 및 시간에 대한 정보를 반환합니다. 예를 들어

"#67, Aug  1 1997, 22:34:28"

반환된 문자열은 정적 저장소를 가리키므로 호출자가 값을 수정해서는 안 됩니다. 이 값은 파이썬 코드에서 변수 sys.version 의 일부로 제공됩니다.

void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
…의 일부 안정 ABI.

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.argv, PyConfig.parse_argv, PyConfig.safe_path 를 설정해야 하며, 자세한 내용은 파이썬 초기화 구성 을 참조하십시오.

argcargv 를 기반으로 sys.argv 를 설정합니다. 이 매개변수들은 프로그램의 main() 함수에 전달되는 것과 유사하지만, 첫 번째 항목이 파이썬 인터프리터를 호스팅하는 실행 파일이 아니라 실행될 스크립트 파일을 가리켜야 한다는 점이 다릅니다. 실행할 스크립트가 없는 경우 argv 의 첫 번째 항목은 빈 문자열일 수 있습니다. 이 함수가 sys.argv 를 초기화하는 데 실패하면 Py_FatalError() 를 사용하여 치명적인 상황을 알립니다.

updatepath 가 0인 경우, 이 함수는 여기까지 수행합니다. updatepath 가 0이 아닌 경우, 함수는 다음 알고리즘에 따라 sys.path 도 수정합니다.

  • argv[0] 에 존재하는 스크립트 이름이 전달되면, 해당 스크립트가 위치한 디렉터리의 절대 경로가 sys.path 앞에 추가됩니다.

  • 그렇지 않은 경우(즉, argc0 이거나 argv[0] 이 존재하는 파일 이름을 가리키지 않는 경우), 빈 문자열이 sys.path 앞에 추가되며 이는 현재 작업 디렉터리(".")를 추가하는 것과 동일합니다.

바이트열을 디코딩하여 wchar_t* 문자열을 얻으려면 Py_DecodeLocale() 을 사용하십시오.

파이썬 초기화 구성PyConfig.orig_argvPyConfig.argv 멤버를 참조하십시오.

참고

단일 스크립트 실행 외의 목적으로 파이썬 인터프리터를 포함하는 애플리케이션은 updatepath0 을 전달하고, 필요한 경우 스스로 sys.path 를 업데이트하는 것을 권장합니다. CVE 2008-5983 을 참조하십시오.

3.1.3 이전 버전에서는 PySys_SetArgv() 를 호출한 후 첫 번째 sys.path 요소를 수동으로 팝(pop)하여 동일한 효과를 얻을 수 있습니다. 예:

PyRun_SimpleString("import sys; sys.path.pop(0)\n");

Added in version 3.1.3.

버전 3.11부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

void PySys_SetArgv(int argc, wchar_t **argv)
…의 일부 안정 ABI.

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.argvPyConfig.parse_argv 를 설정해야 하며, 자세한 내용은 파이썬 초기화 구성 를 참조하십시오.

이 함수는 python 인터프리터가 -I 옵션과 함께 시작되지 않는 한, updatepath1 로 설정한 PySys_SetArgvEx() 와 동일하게 작동합니다.

바이트열을 디코딩하여 wchar_t* 문자열을 얻으려면 Py_DecodeLocale() 을 사용하십시오.

파이썬 초기화 구성PyConfig.orig_argvPyConfig.argv 멤버를 참조하십시오.

버전 3.4에서 변경: updatepath 값은 -I 에 따라 달라집니다.

버전 3.11부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

void Py_SetPythonHome(const wchar_t *home)
…의 일부 안정 ABI.

이 API는 하위 호환성을 위해 유지됩니다. 대신 PyConfig.home 을 설정해야 하며, 자세한 내용은 파이썬 초기화 구성 를 참조하십시오.

기본 “홈” 디렉터리(즉, 표준 파이썬 라이브러리의 위치)를 설정합니다. 인자 문자열의 의미는 PYTHONHOME 을 참조하십시오.

인자는 프로그램 실행 동안 내용이 변경되지 않는 정적 저장소의 0으로 끝나는 문자열을 가리켜야 합니다. 파이썬 인터프리터의 코드는 이 저장소의 내용을 변경하지 않습니다.

바이트열을 디코딩하여 wchar_t* 문자열을 얻으려면 Py_DecodeLocale() 을 사용하십시오.

버전 3.11부터 사용 지원 중단(deprecated), 버전 3.16에서 제거됨.

분실물 보관소