Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 587 – 파이썬 초기화 구성

Author:
Victor Stinner <vstinner at python.org>, Alyssa Coghlan <ncoghlan at gmail.com>
BDFL-Delegate:
Thomas Wouters <thomas at python.org>
Discussions-To:
Python-Dev list
Status:
Final
Type:
Standards Track
Created:
27-Mar-2019
Python-Version:
3.8

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

전체 구성을 더욱 세밀하게 제어하고 오류 보고를 개선할 수 있도록 파이썬 초기화를 구성하는 새로운 C API를 추가합니다.

구성을 읽은 다음 적용하기 전에 계산된 일부 매개변수를 재정의할 수 있습니다. 또한 파이썬이 모듈 검색 경로(sys.path)를 계산하는 방식을 완전히 재정의할 수 있습니다.

새로운 Isolated Configuration은 파이썬을 시스템으로부터 격리할 수 있도록 합리적인 기본값을 제공합니다. 예를 들어, 파이썬을 애플리케이션에 임베드할 수 있습니다. 이제 환경 사용은 옵트아웃 옵션이 아니라 옵트인 옵션입니다. 예를 들어 환경 변수, 명령줄 인자 및 전역 구성 변수는 기본적으로 무시됩니다.

새로운 Py_RunMain() 함수를 사용하면 일반 파이썬처럼 동작하는 사용자 지정 파이썬을 더 쉽게 빌드할 수 있습니다. 또한 Python Configuration을 사용하면 PyConfig.argv 인자가 이제 일반 파이썬이 명령줄 인자를 해석하는 방식과 동일하게 해석되며, PyConfig.xoptions-X opt 명령줄 옵션으로 처리됩니다.

이는 이제 공개하기에 충분히 안정적이라고 판단된 PEP 432 개발 및 리팩터링 작업에서 API 설계의 일부를 추출한 것입니다. 이를 통해 타사 임베딩 애플리케이션은 네이티브 CPython CLI가 현재 사용하는 것과 동일한 구성 API에 액세스할 수 있습니다.

근거

파이썬은 매우 유연하게 구성할 수 있지만, 그 구성은 유기적으로 발전해 왔습니다. 초기화 구성은 서로 다른 설정 방식인 전역 구성 변수(예: Py_IsolatedFlag), 환경 변수(예: PYTHONPATH), 명령줄 인자(예: -b), 구성 파일(예: pyvenv.cfg), 함수 호출(예: Py_SetProgramName())을 사용하여 코드 전반에 분산되어 있습니다. 파이썬을 구성할 수 있는 간단하고 신뢰할 수 있는 방법이 필요합니다.

일부 구성 매개변수는 C API에서 접근할 수 없거나 쉽게 접근할 수 없습니다. 예를 들어 sys.executable의 기본값을 재정의하는 API는 없습니다.

PYTHONPATH와 같은 일부 옵션은 환경 변수를 통해서만 설정할 수 있으며, 이를 적절히 해제하지 않으면 파이썬 자식 프로세스에 부작용을 일으킵니다.

일부 옵션은 다른 옵션에도 의존합니다. Priority and Rules를 참조하십시오. Python 3.7 API는 전체 구성에 대한 일관된 관점을 제공하지 않습니다.

Python 3.7 초기화의 C API는 wchar_t* 문자열을 입력으로 받지만, 파이썬 파일 시스템 인코딩은 초기화 중에 설정되므로 문자가 깨질 수 있습니다.

Py_Initialize()와 같은 Python 3.7 API는 메모리 할당에 실패하면 프로세스를 중단하므로, 파이썬을 임베드할 때 편리하지 않습니다. 또한 Py_Main()은 종료 코드를 반환하는 대신 프로세스를 직접 종료할 수 있습니다. 제안된 새 API는 오류 또는 종료 코드를 호출자에게 보고하며, 호출자는 이를 처리할 방법을 결정할 수 있습니다.

Python 3.6에서 PEP 540(UTF-8 모드)와 새로운 -X dev를 올바르게 구현하는 것은 거의 불가능했습니다. Python 3.7에서, 이어서 Python 3.8에서 코드 기반을 대대적으로 재작업하여 부작용 없이 구성을 구조체로 읽도록 했습니다. 인코딩이 변경된 경우 구성을 지우고(메모리를 해제하고) 구성을 다시 읽을 수 있게 되었습니다. -X utf8 명령줄 옵션을 사용하여 인코딩을 변경하는 UTF-8을 올바르게 구현해야 합니다. 내부적으로 바이트 argv 문자열은 파일 시스템 인코딩에서 디코딩됩니다. -X dev는 메모리 할당자를 변경하여(PYTHONMALLOC=debug처럼 동작함) 명령줄 인자를 구문 분석하는 동안에는 메모리 할당을 변경할 수 없었던 문제를 해결합니다. 내부 구현의 새로운 설계는 -X utf8-X dev를 올바르게 구현할 수 있게 했을 뿐만 아니라, 특히 이와 같은 코너 케이스에서 파이썬의 동작을 훨씬 더 쉽게 변경하고 구성이 일관되게 유지되도록 합니다. Priority and Rules를 참조하십시오.

이 PEP는 전체 설계인 PEP 432를 부분적으로 구현한 것입니다. 나중에 PyConfig 구조체에 새 필드를 추가하여 PEP 432의 구현을 완성할 수 있습니다(예를 들어, 전체 초기화를 완료하도록 Python 객체를 사용해 Python을 구성할 수 있게 하는 새로운 부분 초기화 API를 추가하는 방식으로 가능합니다). 그러나 네이티브 CPython CLI조차 그런 방식으로 작동하지 않기 때문에 이 PEP에서는 이러한 기능을 생략합니다. 이 PEP의 공개 API 제안은 네이티브 CPython CLI에서 이미 구현되어 내부 비공개 API로 채택된 기능으로 제한됩니다.

Python 초기화 C API

이 PEP는 다음과 같은 새로운 구조체와 함수를 추가할 것을 제안합니다.

새로운 구조체:

  • PyConfig
  • PyPreConfig
  • PyStatus
  • PyWideStringList

새로운 함수:

  • PyConfig_Clear(config)
  • PyConfig_InitIsolatedConfig()
  • PyConfig_InitPythonConfig()
  • PyConfig_Read(config)
  • PyConfig_SetArgv(config, argc, argv)
  • PyConfig_SetBytesArgv(config, argc, argv)
  • PyConfig_SetBytesString(config, config_str, str)
  • PyConfig_SetString(config, config_str, str)
  • PyPreConfig_InitIsolatedConfig(preconfig)
  • PyPreConfig_InitPythonConfig(preconfig)
  • PyStatus_Error(err_msg)
  • PyStatus_Exception(status)
  • PyStatus_Exit(exitcode)
  • PyStatus_IsError(status)
  • PyStatus_IsExit(status)
  • PyStatus_NoMemory()
  • PyStatus_Ok()
  • PyWideStringList_Append(list, item)
  • PyWideStringList_Insert(list, index, item)
  • Py_BytesMain(argc, argv)
  • Py_ExitStatusException(status)
  • Py_InitializeFromConfig(config)
  • Py_PreInitialize(preconfig)
  • Py_PreInitializeFromArgs(preconfig, argc, argv)
  • Py_PreInitializeFromBytesArgs(preconfig, argc, argv)
  • Py_RunMain()

이 PEP는 이러한 내부 구조체에 _PyRuntimeState.preconfig (PyPreConfig 타입) 및 PyInterpreterState.config (PyConfig 타입) 필드도 추가합니다. PyInterpreterState.config는 전역 구성 변수와 기타 비공개 변수를 대체하는 새로운 참조 구성이 됩니다.

PyWideStringList

PyWideStringListwchar_t* 문자열의 리스트입니다.

PyWideStringList 구조체 필드:

  • length (Py_ssize_t)
  • items (wchar_t**)

메서드:

  • PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item): itemlist에 추가합니다.
  • PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item): itemlistindex에 삽입합니다. indexlist의 길이보다 크면 itemlist에 추가하기만 합니다.

length가 0이 아니면 items는 NULL이 아니어야 하며 모든 문자열도 NULL이 아니어야 합니다.

PyStatus

PyStatus는 초기화 함수의 상태(성공, 오류 또는 종료)를 저장하는 구조체입니다. 오류가 발생한 경우 오류를 생성한 C 함수의 이름을 저장할 수 있습니다.

예제:

PyStatus alloc(void **ptr, size_t size)
{
    *ptr = PyMem_RawMalloc(size);
    if (*ptr == NULL) {
        return PyStatus_NoMemory();
    }
    return PyStatus_Ok();
}

int main(int argc, char **argv)
{
    void *ptr;
    PyStatus status = alloc(&ptr, 16);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }
    PyMem_Free(ptr);
    return 0;
}

PyStatus 필드:

  • exitcode (int): exit()에 전달되는 인자입니다.
  • err_msg (const char*): 오류 메시지입니다.
  • func (const char *): 오류를 생성한 함수의 이름이며, NULL일 수 있습니다.
  • private _type 필드: 내부 사용 전용입니다.

상태를 생성하는 함수:

  • PyStatus_Ok(): 성공입니다.
  • PyStatus_Error(err_msg): 메시지가 포함된 초기화 오류입니다.
  • PyStatus_NoMemory(): 메모리 할당 실패(메모리 부족)입니다.
  • PyStatus_Exit(exitcode): 지정된 종료 코드로 Python을 종료합니다.

상태를 처리하는 함수:

  • PyStatus_Exception(status): 결과가 오류입니까, 아니면 종료입니까? 참이면 예외를 처리해야 합니다. 예를 들어 Py_ExitStatusException(status)을 호출하여 처리합니다.
  • PyStatus_IsError(status): 결과가 오류입니까?
  • PyStatus_IsExit(status): 결과가 종료입니까?
  • Py_ExitStatusException(status): status가 종료이면 exit(exitcode)을 호출합니다. status가 오류이면 오류 메시지를 출력하고 0이 아닌 종료 코드로 종료합니다. PyStatus_Exception(status)이 참인 경우에만 호출해야 합니다.

Note

내부적으로 Python은 PyStatus.func를 설정하는 매크로를 사용하는 반면, 상태를 생성하는 함수는 funcNULL로 설정합니다.

PyPreConfig를 사용한 사전 초기화

PyPreConfig 구조체는 Python을 사전 초기화하는 데 사용됩니다.

  • Python 메모리 할당자를 설정합니다.
  • LC_CTYPE 로캘을 구성합니다.
  • UTF-8 모드를 설정합니다.

UTF-8 모드를 활성화하기 위한 사전 초기화 사용 예:

PyStatus status;
PyPreConfig preconfig;

PyPreConfig_InitPythonConfig(&preconfig);

preconfig.utf8_mode = 1;

status = Py_PreInitialize(&preconfig);
if (PyStatus_Exception(status)) {
    Py_ExitStatusException(status);
}

/* at this point, Python will speak UTF-8 */

Py_Initialize();
/* ... use Python API here ... */
Py_Finalize();

사전 구성을 초기화하는 함수:

  • PyStatus PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)
  • PyStatus PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)

Python을 사전 초기화하는 함수:

  • PyStatus Py_PreInitialize(const PyPreConfig *preconfig)
  • PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv)
  • PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv)

호출자는 PyStatus_Exception()Py_ExitStatusException()을 사용하여 예외(오류 또는 종료)를 처리해야 합니다.

Python Configuration (PyPreConfig_InitPythonConfig())의 경우, 명령줄 인자를 사용하여 Python을 초기화한다면 명령줄 인자를 Python의 사전 초기화에도 전달해야 합니다. 인코딩과 같은 사전 구성에 영향을 주기 때문입니다. 예를 들어 -X utf8 명령줄 옵션은 UTF-8 모드를 활성화합니다.

PyPreConfig 필드:

  • allocator (int): 메모리 할당자의 이름(예: PYMEM_ALLOCATOR_MALLOC)입니다. 유효한 값:
    • PYMEM_ALLOCATOR_NOT_SET (0): 메모리 할당자를 변경하지 않습니다(기본값 사용).
    • PYMEM_ALLOCATOR_DEFAULT (1): 기본 메모리 할당자
    • PYMEM_ALLOCATOR_DEBUG (2): 디버그 후크가 있는 기본 메모리 할당자
    • PYMEM_ALLOCATOR_MALLOC (3): malloc() 사용을 강제합니다.
    • PYMEM_ALLOCATOR_MALLOC_DEBUG (4): 디버그 후크가 있는 malloc() 사용을 강제합니다.
    • PYMEM_ALLOCATOR_PYMALLOC (5): Python “pymalloc” 할당자입니다.
    • PYMEM_ALLOCATOR_PYMALLOC_DEBUG (6): 디버그 후크가 있는 Python “pymalloc” 할당자입니다.
    • 참고: Python이 --without-pymalloc을 사용하여 구성된 경우 PYMEM_ALLOCATOR_PYMALLOCPYMEM_ALLOCATOR_PYMALLOC_DEBUG는 지원되지 않습니다.
  • configure_locale (int): LC_CTYPE 로캘을 사용자가 선호하는 로캘로 설정합니까? 0과 같으면 coerce_c_localecoerce_c_locale_warn을 0으로 설정합니다.
  • coerce_c_locale (int): 2와 같으면 C 로캘을 강제 변환하고, 1과 같으면 강제 변환해야 하는지 결정하기 위해 LC_CTYPE 로캘을 읽습니다.
  • coerce_c_locale_warn (int): 0이 아니면 C 로캘이 강제 변환될 때 경고를 발생시킵니다.
  • dev_mode (int): PyConfig.dev_mode를 참조하십시오.
  • isolated (int): PyConfig.isolated를 참조하십시오.
  • legacy_windows_fs_encoding (int, Windows 전용): 0이 아니면 UTF-8 모드를 비활성화하고, Python 파일 시스템 인코딩을 mbcs로 설정하며, 파일 시스템 오류 처리기를 replace로 설정합니다.
  • parse_argv (int): 0이 아니면 Py_PreInitializeFromArgs()Py_PreInitializeFromBytesArgs()는 일반 Python이 명령줄 인자를 구문 분석하는 방식과 동일하게 argv 인자를 구문 분석합니다. Command Line Arguments를 참조하십시오.
  • use_environment (int): PyConfig.use_environment를 참조하십시오.
  • utf8_mode (int): 0이 아니면 UTF-8 모드를 활성화합니다.

legacy_windows_fs_encoding 필드는 Windows에서만 사용할 수 있습니다. Windows 전용 코드에는 #ifdef MS_WINDOWS 매크로를 사용할 수 있습니다.

PyPreConfig 비공개 필드이며, 내부 전용입니다:

  • _config_init (int): PyConfig를 초기화하는 데 사용되는 함수이며, 사전 초기화에 사용됩니다.

PyMem_SetAllocator()Py_PreInitialize() 호출 후 및 Py_InitializeFromConfig() 호출 전에 호출하여 사용자 지정 메모리 할당자를 설치할 수 있습니다. allocatorPYMEM_ALLOCATOR_NOT_SET(기본값)으로 설정된 경우 Py_PreInitialize() 호출 전에 호출할 수 있습니다.

PyMem_RawMalloc()과 같은 Python 메모리 할당 함수는 Python 사전 초기화 전에 사용해서는 안 되지만, malloc()free()을 직접 호출하는 것은 항상 안전합니다. Py_DecodeLocale()은 사전 초기화 전에 호출해서는 안 됩니다.

PyConfig를 사용한 초기화입니다.

PyConfig 구조체에는 Python을 구성하기 위한 대부분의 매개변수가 포함되어 있습니다.

프로그램 이름 설정 예제입니다.:

void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name. Implicitly preinitialize Python. */
    status = PyConfig_SetString(&config, &config.program_name,
                                L"/path/to/my_program");
    if (PyStatus_Exception(status)) {
        goto fail;
    }

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) {
        goto fail;
    }
    PyConfig_Clear(&config);
    return;

fail:
    PyConfig_Clear(&config);
    Py_ExitStatusException(status);
}

PyConfig 메서드입니다:

  • void PyConfig_InitPythonConfig(PyConfig *config) Python Configuration으로 구성을 초기화합니다.
  • void PyConfig_InitIsolatedConfig(PyConfig *config): Isolated Configuration으로 구성을 초기화합니다.
  • PyStatus PyConfig_SetString(PyConfig *config, wchar_t * const *config_str, const wchar_t *str): 와이드 문자 문자열 str*config_str로 복사합니다. 필요한 경우 Python을 사전 초기화합니다.
  • PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t * const *config_str, const char *str): strPy_DecodeLocale()을 사용하여 디코딩하고 그 결과를 *config_str로 설정합니다. 필요한 경우 Python을 사전 초기화합니다.
  • PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t * const *argv): 와이드 문자 문자열에서 명령줄 인자를 설정합니다. 필요한 경우 Python을 사전 초기화합니다.
  • PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char * const *argv): 명령줄 인자를 설정합니다: Py_DecodeLocale()을 사용하여 바이트를 디코딩합니다. 필요한 경우 Python을 사전 초기화합니다.
  • PyStatus PyConfig_Read(PyConfig *config): 모든 Python 구성을 읽습니다. 이미 초기화된 필드는 변경하지 않은 상태로 둡니다. 필요한 경우 Python을 사전 초기화합니다.
  • void PyConfig_Clear(PyConfig *config): 구성 메모리를 해제합니다.

대부분의 PyConfig 메서드는 필요한 경우 Python을 사전 초기화합니다. 이 경우 Python 사전 초기화 구성은 PyConfig를 기반으로 합니다. PyPreConfig와 공통되는 구성 필드를 조정하는 경우 PyConfig 메서드를 호출하기 전에 설정해야 합니다:

  • dev_mode
  • isolated
  • parse_argv
  • use_environment

또한 PyConfig_SetArgv() 또는 PyConfig_SetBytesArgv()를 사용하는 경우, parse_argv가 0이 아닌 경우 사전 초기화 구성이 명령줄 인자에 의존하므로 이 메서드를 다른 메서드보다 먼저 호출해야 합니다.

Python을 초기화하는 함수:

  • PyStatus Py_InitializeFromConfig(const PyConfig *config): config 구성에서 Python을 초기화합니다.

이러한 메서드와 함수를 호출하는 코드는 PyStatus_Exception()Py_ExitStatusException()을 사용하여 예외(오류 또는 종료)를 처리해야 합니다.

PyConfig 필드:

  • argv (PyWideStringList): 명령줄 인자, sys.argv입니다. 일반 Python이 Python 명령줄 인자를 구문 분석하는 것과 같은 방식으로 argv를 구문 분석하려면 parse_argv를 참조하십시오. argv가 비어 있으면 sys.argv가 항상 존재하고 비어 있지 않도록 빈 문자열을 추가합니다.
  • base_exec_prefix (wchar_t*): sys.base_exec_prefix입니다.
  • base_prefix (wchar_t*): sys.base_prefix입니다.
  • buffered_stdio (int): 0과 같으면 버퍼링되지 않는 모드를 활성화하여 stdout 및 stderr 스트림을 버퍼링되지 않게 합니다.
  • bytes_warning (int): 1과 같으면 bytes 또는 bytearraystr과 비교하거나 bytesint와 비교할 때 경고를 발생시킵니다. 2 이상이면 BytesWarning 예외를 발생시킵니다.
  • check_hash_pycs_mode (wchar_t*): --check-hash-based-pycs 명령줄 옵션 값입니다(PEP 552 참조). 유효한 값은 always, neverdefault입니다. 기본값은 default입니다.
  • configure_c_stdio (int): 0이 아닌 경우 C 표준 스트림(stdio, stdout, stdout)을 구성합니다. 예를 들어 Windows에서 해당 스트림의 모드를 O_BINARY로 설정합니다.
  • dev_mode (int): 개발 모드입니다.
  • dump_refs (int): 0이 아니면 종료 시 아직 살아 있는 모든 객체를 덤프합니다. Py_REF_DEBUG 매크로가 정의된 특수 Python 빌드가 필요합니다.
  • exec_prefix (wchar_t*): sys.exec_prefix입니다.
  • executable (wchar_t*): sys.executable입니다.
  • faulthandler (int): 0이 아니면 faulthandler.enable()를 호출합니다.
  • filesystem_encoding (wchar_t*): 파일 시스템 인코딩, sys.getfilesystemencoding()입니다.
  • filesystem_errors (wchar_t*): 파일 시스템 인코딩 오류, sys.getfilesystemencodeerrors()입니다.
  • use_hash_seed (int), hash_seed (unsigned long): 무작위화된 해시 함수 시드입니다.
  • home (wchar_t*): Python 홈 디렉터리입니다.
  • import_time (int): 0이 아니면 임포트 시간을 프로파일링합니다.
  • inspect (int): 스크립트 또는 명령을 실행한 후 대화형 모드로 진입합니다.
  • install_signal_handlers (int): 시그널 핸들러를 설치합니까?
  • interactive (int): 대화형 모드입니다.
  • isolated (int): 0보다 크면 격리 모드를 활성화합니다:
    • sys.path에는 스크립트 디렉터리(argv[0] 또는 현재 디렉터리에서 계산됨)와 사용자의 site-packages 디렉터리가 모두 포함되지 않습니다.
    • Python REPL은 대화형 프롬프트에서 readline을 임포트하지 않으며 기본 readline 구성도 활성화하지 않습니다.
    • use_environmentuser_site_directory를 0으로 설정합니다.
  • legacy_windows_stdio (int, Windows 전용): 0이 아니면 sys.stdin, sys.stdout, sys.stderrWindowsConsoleIO 대신 io.FileIO를 사용합니다.
  • malloc_stats (int): 0이 아니면 종료 시 pymalloc 메모리 할당자의 통계를 덤프합니다. Python이 --without-pymalloc을 사용하여 빌드된 경우 이 옵션은 무시됩니다.
  • pythonpath_env (wchar_t*): DELIM(일반적으로 : 문자)으로 구분된 문자열 형식의 모듈 검색 경로입니다. 기본적으로 PYTHONPATH 환경 변수 값에서 초기화됩니다.
  • module_search_paths_set (int), module_search_paths (PyWideStringList): sys.path입니다. module_search_paths_set이 0과 같으면 Path Configuration을 계산하는 함수가 module_search_paths를 재정의합니다.
  • optimization_level (int): 컴파일 최적화 수준입니다:
    • 0: 피프홀 최적화 프로그램을 사용합니다(그리고 __debug__True로 설정됩니다).
    • 1: 어설션을 제거하고 __debug__False로 설정합니다.
    • 2: 독스트링을 제거합니다.
  • parse_argv (int): 0이 아니면 일반 Python 명령줄 인자와 같은 방식으로 argv를 구문 분석하고 argv에서 Python 인자를 제거합니다. Command Line Arguments를 참조하십시오.
  • parser_debug (int): 0이 아니면 파서 디버깅 출력을 활성화합니다(전문가 전용이며 컴파일 옵션에 따라 달라집니다).
  • pathconfig_warnings (int): 0과 같으면 경로 구성을 계산할 때 경고를 표시하지 않습니다(Unix만 해당하며 Windows에서는 경고를 기록하지 않습니다). 그렇지 않으면 경고가 stderr에 기록됩니다.
  • prefix (wchar_t*): sys.prefix입니다.
  • program_name (wchar_t*): 프로그램 이름입니다.
  • pycache_prefix (wchar_t*): .pyc 캐시 접두사입니다.
  • quiet (int): 조용한 모드입니다. 예를 들어, 대화형 모드에서도 저작권 및 버전 메시지를 표시하지 않습니다.
  • run_command (wchar_t*): python3 -c COMMAND 인자입니다.
  • run_filename (wchar_t*): python3 FILENAME 인자입니다.
  • run_module (wchar_t*): python3 -m MODULE 인자입니다.
  • show_alloc_count (int): 종료 시 할당 횟수를 표시합니까? COUNT_ALLOCS 매크로가 정의된 특수 Python 빌드가 필요합니다.
  • show_ref_count (int): 종료 시 총 참조 횟수를 표시합니까? Python의 디버그 빌드가 필요합니다 (Py_REF_DEBUG 매크로가 정의되어 있어야 합니다).
  • site_import (int): 시작 시 site 모듈을 가져옵니까?
  • skip_source_first_line (int): 소스의 첫 번째 줄을 건너뜁니까?
  • stdio_encoding (wchar_t*), stdio_errors (wchar_t*): sys.stdin, sys.stdoutsys.stderr의 인코딩과 인코딩 오류입니다.
  • tracemalloc (int): 0이 아니면 tracemalloc.start(value)를 호출합니다.
  • user_site_directory (int): 0이 아니면 사용자 사이트 디렉터리를 sys.path에 추가합니다.
  • verbose (int): 0이 아니면 자세한 정보 표시 모드를 활성화합니다.
  • warnoptions (PyWideStringList): 경고 필터를 구성하기 위한 warnings 모듈의 옵션입니다.
  • write_bytecode (int): 0이 아니면 .pyc 파일을 씁니다.
  • xoptions (PyWideStringList): sys._xoptions입니다.

legacy_windows_stdio 필드는 Windows에서만 사용할 수 있습니다. #ifdef MS_WINDOWS 매크로를 Windows 전용 코드에 사용할 수 있습니다.

parse_argv가 0이 아니면, 일반 Python이 명령줄 인자를 구문 분석하는 것과 같은 방식으로 argv 인자를 구문 분석하고 Python 인자를 argv에서 제거합니다. Command Line Arguments를 참조하십시오.

다른 옵션을 설정하기 위해 xoptions 옵션을 구문 분석합니다. -X Options를 참조하십시오.

PyConfig 비공개 필드(내부 사용 전용):

  • _config_init (int): PyConfig를 초기화하는 데 사용되며, 사전 초기화에 사용되는 함수입니다.
  • _install_importlib (int): importlib을 설치합니까?
  • _init_main (int): 0과 같으면 “main” 단계 전에 Python 초기화를 중지합니다 (PEP 432 참조).

기본 구성을 수정하고, 구성을 읽은 다음 일부 매개변수를 재정의하는 더 완전한 예제입니다.:

PyStatus init_python(const char *program_name)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name before reading the configuration
       (decode byte string from the locale encoding).

       Implicitly preinitialize Python. */
    status = PyConfig_SetBytesString(&config, &config.program_name,
                                  program_name);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Read all configuration at once */
    status = PyConfig_Read(&config);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Append our custom search path to sys.path */
    status = PyWideStringList_Append(&config.module_search_paths,
                                  L"/path/to/more/modules");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Override executable computed by PyConfig_Read() */
    status = PyConfig_SetString(&config, &config.executable,
                                L"/path/to/my_executable");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    status = Py_InitializeFromConfig(&config);

done:
    PyConfig_Clear(&config);
    return status;
}

Note

PyImport_FrozenModules, PyImport_AppendInittab()PyImport_ExtendInittab() 함수는 여전히 관련이 있으며 이전과 같이 계속 작동합니다. Python 사전 초기화 후 Python 초기화 전에 설정하거나 호출해야 합니다.

격리된 구성

PyPreConfig_InitIsolatedConfig()PyConfig_InitIsolatedConfig() 함수는 Python을 시스템으로부터 격리하는 구성을 생성합니다. 예를 들어, Python을 애플리케이션에 임베드할 때 사용합니다.

이 구성은 전역 구성 변수, 환경 변수 및 명령줄 인자를 무시합니다(argv는 구문 분석되지 않습니다). C 표준 스트림(예: stdout)과 LC_CTYPE 로캘은 기본적으로 변경되지 않은 상태로 유지됩니다.

이 구성에서도 구성 파일은 계속 사용됩니다. 이러한 구성 파일을 무시하고 함수가 기본 경로 구성을 계산하지 않도록 Path Configuration (“출력 필드”)을 설정하십시오.

Python 구성

PyPreConfig_InitPythonConfig()PyConfig_InitPythonConfig() 함수는 일반 Python처럼 동작하는 사용자 지정 Python을 빌드하기 위한 구성을 생성합니다.

환경 변수와 명령줄 인자를 사용하여 Python을 구성하지만, 전역 구성 변수는 무시됩니다.

이 함수는 C 로캘 강제 변환(PEP 538) 및 UTF-8 모드(PEP 540) LC_CTYPE 로캘, PYTHONUTF8PYTHONCOERCECLOCALE 환경 변수에 따라 활성화합니다.

항상 격리 모드로 실행되는 사용자 지정 Python의 예:

int main(int argc, char **argv)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    config.isolated = 1;

    /* Decode command line arguments.
       Implicitly preinitialize Python (in isolated mode). */
    status = PyConfig_SetBytesArgv(&config, argc, argv);
    if (PyStatus_Exception(status)) {
        goto fail;
    }

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) {
        goto fail;
    }
    PyConfig_Clear(&config);

    return Py_RunMain();

fail:
    PyConfig_Clear(&config);
    if (PyStatus_IsExit(status)) {
        return status.exitcode;
    }
    /* Display the error message and exit the process with
       non-zero exit code */
    Py_ExitStatusException(status);
}

이 예제는 PEP 432에서 설명한 “System Python Executable”의 기본 구현입니다.

경로 구성

PyConfig에는 경로 구성을 위한 여러 필드가 포함되어 있습니다.

  • 경로 구성 입력 필드:
    • home
    • pythonpath_env
    • pathconfig_warnings
  • 경로 구성 출력 필드:
    • exec_prefix
    • executable
    • prefix
    • module_search_paths_set, module_search_paths

하나 이상의 “출력 필드”가 설정되지 않은 경우, Python은 설정되지 않은 필드를 채우기 위해 경로 구성을 계산합니다. module_search_paths_set이 0과 같으면 module_search_paths가 재정의되고 module_search_paths_set이 1로 설정됩니다.

위에 나열된 모든 경로 구성 출력 필드를 명시적으로 설정하여 기본 경로 구성을 계산하는 함수를 완전히 무시할 수 있습니다. 문자열은 비어 있지 않더라도 설정된 것으로 간주됩니다. module_search_pathsmodule_search_paths_set이 1로 설정된 경우 설정된 것으로 간주됩니다. 이 경우 경로 구성 입력 필드도 무시됩니다.

경로 구성을 계산할 때 경고를 표시하지 않으려면 pathconfig_warnings를 0으로 설정하십시오(Unix만 해당하며, Windows에서는 경고를 기록하지 않습니다).

base_prefix 또는 base_exec_prefix 필드가 설정되지 않은 경우 각각 prefixexec_prefix의 값을 상속합니다.

Py_RunMain()Py_Main()sys.path를 수정합니다:

  • run_filename이 설정되어 있고 __main__.py 스크립트를 포함하는 디렉터리인 경우, run_filenamesys.path앞에 추가합니다.
  • isolated가 0인 경우:
    • run_module이 설정되어 있으면 현재 디렉터리를 sys.path앞에 추가합니다. 현재 디렉터리를 읽을 수 없으면 아무 작업도 하지 않습니다.
    • run_filename이 설정되어 있으면 파일 이름의 디렉터리를 sys.path앞에 추가합니다.
    • 그렇지 않으면 빈 문자열을 sys.path앞에 추가합니다.

site_import이 0이 아니면 site 모듈이 sys.path를 수정할 수 있습니다. user_site_directory가 0이 아니고 사용자의 사이트 패키지 디렉터리가 존재하면 site 모듈이 사용자의 사이트 패키지 디렉터리를 sys.path에 추가합니다.

경로 구성에 사용되는 Configuration Files도 참조하십시오.

Py_BytesMain()

Python 3.7은 명령줄 인자를 wchar_t* 문자열로 전달해야 하는 고수준 Py_Main() 함수를 제공합니다. 바이트를 디코딩하는 데 올바른 인코딩을 사용하는 일은 쉽지 않습니다. Python에는 C 로캘 강제 변환 및 UTF-8 모드와 관련된 자체적인 문제도 있습니다.

이 PEP는 명령줄 인자를 바이트로 받는 새로운 Py_BytesMain() 함수를 추가합니다.:

int Py_BytesMain(int argc, char **argv)

Py_RunMain()

새로운 Py_RunMain() 함수는 명령줄이나 구성에 지정된 명령(PyConfig.run_command), 스크립트(PyConfig.run_filename) 또는 모듈(PyConfig.run_module)을 실행한 다음 Python을 종료합니다. 이 함수는 exit() 함수에 전달할 수 있는 종료 상태를 반환합니다.

int Py_RunMain(void);

항상 격리 모드로 실행되는 사용자 지정 Python의 예는 Python Configuration을 사용한 Py_RunMain()에서 참조하십시오.

다중 단계 초기화 비공개 임시 API

이 절은 PEP 432의 핵심 기능인 다중 단계 초기화를 도입하는 비공개 임시 API입니다:

  • “핵심” 초기화 단계, “최소한의 Python”:
    • 내장 타입;
    • 내장 예외;
    • 내장 및 고정 모듈;
    • sys 모듈은 부분적으로만 초기화됩니다(예: sys.path은 아직 존재하지 않습니다).
  • “주” 초기화 단계, Python이 완전히 초기화됨:
    • importlib을 설치하고 구성합니다;
    • Path Configuration을 적용합니다;
    • 신호 처리기를 설치합니다;
    • sys 모듈 초기화를 완료합니다(예: sys.stdoutsys.path를 생성합니다);
    • faulthandlertracemalloc과 같은 선택적 기능을 활성화합니다;
    • site 모듈을 가져옵니다;
    • 기타.

비공개 잠정 API:

  • PyConfig._init_main: 0으로 설정하면 Py_InitializeFromConfig()는 “Core” 초기화 단계에서 중지합니다.
  • PyStatus _Py_InitializeMain(void): “Main” 초기화 단계로 이동하여 Python 초기화를 완료합니다.

“Core” 단계에서는 모듈을 가져오지 않으며 importlib 모듈도 구성되지 않습니다. Path Configuration은 “Main” 단계에서만 적용됩니다. 이를 통해 Python에서 Python을 사용자 지정하여 Path Configuration을 재정의하거나 조정하고, 사용자 지정 sys.meta_path 임포터 또는 임포트 훅 등을 설치할 수 있습니다.

Core 단계 이후 Main 단계 이전에 Python에서 Path Configuration을 계산하는 것이 가능해질 수 있으며, 이는 PEP 432의 동기 중 하나입니다.

“Core” 단계는 제대로 정의되어 있지 않습니다. 이 단계에서 무엇이 사용 가능해야 하고 무엇이 사용 가능하지 않아야 하는지는 아직 지정되지 않았습니다. 이 API는 비공개이며 잠정적인 것으로 표시되어 있습니다. 적절한 공개 API가 설계될 때까지 언제든 수정되거나 제거될 수 있습니다.

“Core” 및 “Main” 초기화 단계 사이에서 Python 코드를 실행하는 예제:

void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    config._init_main = 0;

    /* ... customize 'config' configuration ... */

    status = Py_InitializeFromConfig(&config);
    PyConfig_Clear(&config);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }

    /* Use sys.stderr because sys.stdout is only created
       by _Py_InitializeMain() */
    int res = PyRun_SimpleString(
        "import sys; "
        "print('Run Python code before _Py_InitializeMain', "
               "file=sys.stderr)");
    if (res < 0) {
        exit(1);
    }

    /* ... put more configuration code here ... */

    status = _Py_InitializeMain();
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }
}

하위 호환성

이 PEP는 새 API만 추가하며 기존 API는 변경하지 않고 하위 호환성에 영향을 미치지 않습니다.

Python 3.7의 Py_Initialize()함수는 문자 깨짐을 방지하기 위해 C 로캘 강제 변환(PEP 538)과 UTF-8 모드(PEP 540)를 이제 기본적으로 비활성화합니다. Python Configuration을 사용하는 새 API가 이를 자동으로 활성화하는 데 필요합니다.

부록

Python 구성과 격리된 구성 비교

PyPreConfig_InitPythonConfig()PyPreConfig_InitIsolatedConfig()의 차이점:

PyPreConfig Python 격리됨
coerce_c_locale_warn -1 0
coerce_c_locale -1 0
configure_locale 1 0
dev_mode -1 0
isolated 0 1
legacy_windows_fs_encoding -1 0
use_environment 0 0
parse_argv 1 0
utf8_mode -1 0

PyConfig_InitPythonConfig()PyConfig_InitIsolatedConfig()의 차이:

PyConfig Python Isolated
configure_c_stdio 1 0
install_signal_handlers 1 0
isolated 0 1
parse_argv 1 0
pathconfig_warnings 1 0
use_environment 1 0
user_site_directory 1 0

우선순위 및 규칙

구성 매개변수의 우선순위는 가장 높은 것부터 가장 낮은 것 순입니다.

  • PyConfig
  • PyPreConfig
  • 구성 파일
  • 명령줄 옵션
  • 환경 변수
  • 전역 구성 변수

경고 옵션의 우선순위는 가장 높은 것부터 가장 낮은 것 순입니다.

  • PyConfig.warnoptions
  • PySys_AddWarnOption()
  • PyConfig.bytes_warning이 1보다 크면 "error::BytesWarning" 필터를 추가하고, 1이면 "default::BytesWarning 필터를 추가합니다.
  • -W opt 명령줄 인자
  • PYTHONWARNINGS 환경 변수
  • PyConfig.dev_mode("default" 필터 추가)

PyConfig 매개변수에 대한 규칙입니다.

  • isolated가 0이 아니면 use_environmentuser_site_directory를 0으로 설정합니다.
  • dev_mode가 0이 아니면 allocator"debug"로 설정하고, faulthandler를 1로 설정하며, "default" 필터를 warnoptions에 추가합니다. 그러나 메모리 할당자를 설정할 때는 PYTHONMALLOC 환경 변수가 dev_mode보다 우선합니다.
  • base_prefix가 설정되지 않으면 prefix값을 상속합니다.
  • base_exec_prefix가 설정되지 않으면 exec_prefix값을 상속합니다.
  • python._pth구성 파일이 있으면 isolated를 1로 설정하고 site_import을 0으로 설정합니다. 그러나 python._pthimport site가 포함되어 있으면 site_import을 1로 설정합니다.

PyConfigPyPreConfig 매개변수에 대한 규칙입니다.

  • PyPreConfig.legacy_windows_fs_encoding이 0이 아닌 경우, PyPreConfig.utf8_mode을 0으로 설정하고, PyConfig.filesystem_encodingmbcs로 설정하며, PyConfig.filesystem_errorsreplace로 설정하십시오.

구성 파일

Path Configuration에서 사용하는 Python 구성 파일:

  • pyvenv.cfg
  • python._pth (Windows 전용)
  • pybuilddir.txt (Unix 전용)

전역 구성 변수

PyPreConfig 필드에 매핑되는 전역 구성 변수:

변수 필드
Py_IgnoreEnvironmentFlag use_environment (NOT)
Py_IsolatedFlag isolated
Py_LegacyWindowsFSEncodingFlag legacy_windows_fs_encoding
Py_UTF8Mode utf8_mode

(NOT)는 PyPreConfig 값이 전역 구성 변수 값의 반대임을 의미합니다. Py_LegacyWindowsFSEncodingFlag은 Windows에서만 사용할 수 있습니다.

PyConfig 필드에 매핑되는 전역 구성 변수:

변수 필드
Py_BytesWarningFlag bytes_warning
Py_DebugFlag parser_debug
Py_DontWriteBytecodeFlag write_bytecode (NOT)
Py_FileSystemDefaultEncodeErrors filesystem_errors
Py_FileSystemDefaultEncoding filesystem_encoding
Py_FrozenFlag pathconfig_warnings (NOT)
Py_HasFileSystemDefaultEncoding filesystem_encoding
Py_HashRandomizationFlag use_hash_seed, hash_seed
Py_IgnoreEnvironmentFlag use_environment (NOT)
Py_InspectFlag inspect
Py_InteractiveFlag interactive
Py_IsolatedFlag isolated
Py_LegacyWindowsStdioFlag legacy_windows_stdio
Py_NoSiteFlag site_import (NOT)
Py_NoUserSiteDirectory user_site_directory (NOT)
Py_OptimizeFlag optimization_level
Py_QuietFlag quiet
Py_UnbufferedStdioFlag buffered_stdio (NOT)
Py_VerboseFlag verbose
_Py_HasFileSystemDefaultEncodeErrors filesystem_errors

(NOT)는 전역 구성 변수 값의 반대인 PyConfig 값임을 의미합니다. Py_LegacyWindowsStdioFlag는 Windows에서만 사용할 수 있습니다.

명령줄 인자

사용법:

python3 [options]
python3 [options] -c COMMAND
python3 [options] -m MODULE
python3 [options] SCRIPT

PyPreConfig필드에 대한 의사 동작으로 매핑된 명령줄 옵션:

옵션 PyConfig필드
-E use_environment = 0
-I isolated = 1
-X dev dev_mode = 1
-X utf8 utf8_mode = 1
-X utf8=VALUE utf8_mode = VALUE

PyConfig필드에 대한 의사 동작으로 매핑된 명령줄 옵션:

옵션 PyConfig필드
-b bytes_warning++
-B write_bytecode = 0
-c COMMAND run_command = COMMAND
--check-hash-based-pycs=MODE check_hash_pycs_mode = MODE
-d parser_debug++
-E use_environment = 0
-i inspect++interactive++
-I isolated = 1
-m MODULE run_module = MODULE
-O optimization_level++
-q quiet++
-R use_hash_seed = 0
-s user_site_directory = 0
-S site_import
-t 무시됩니다(하위 호환성을 위해 유지됩니다).
-u buffered_stdio = 0
-v verbose++
-W WARNING WARNINGwarnoptions에 추가합니다.
-x skip_source_first_line = 1
-X OPTION OPTIONxoptions에 추가합니다.

-h, -?-V 옵션은 PyConfig 없이 처리됩니다.

-X 옵션

-X 옵션은 PyConfig 필드의 의사 동작으로 매핑됩니다:

옵션 PyConfig 필드
-X dev dev_mode = 1
-X faulthandler faulthandler = 1
-X importtime import_time = 1
-X pycache_prefix=PREFIX pycache_prefix = PREFIX
-X showalloccount show_alloc_count = 1
-X showrefcount show_ref_count = 1
-X tracemalloc=N tracemalloc = N

환경 변수

PyPreConfig 필드에 매핑되는 환경 변수:

변수 PyPreConfig 필드
PYTHONCOERCECLOCALE coerce_c_locale, coerce_c_locale_warn
PYTHONDEVMODE dev_mode
PYTHONLEGACYWINDOWSFSENCODING legacy_windows_fs_encoding
PYTHONMALLOC allocator
PYTHONUTF8 utf8_mode

PyConfig 필드에 매핑되는 환경 변수:

변수 PyConfig 필드
PYTHONDEBUG parser_debug
PYTHONDEVMODE dev_mode
PYTHONDONTWRITEBYTECODE write_bytecode
PYTHONDUMPREFS dump_refs
PYTHONEXECUTABLE program_name
PYTHONFAULTHANDLER faulthandler
PYTHONHASHSEED use_hash_seed, hash_seed
PYTHONHOME home
PYTHONINSPECT inspect
PYTHONIOENCODING stdio_encoding, stdio_errors
PYTHONLEGACYWINDOWSSTDIO legacy_windows_stdio
PYTHONMALLOCSTATS malloc_stats
PYTHONNOUSERSITE user_site_directory
PYTHONOPTIMIZE optimization_level
PYTHONPATH pythonpath_env
PYTHONPROFILEIMPORTTIME import_time
PYTHONPYCACHEPREFIX, pycache_prefix
PYTHONTRACEMALLOC tracemalloc
PYTHONUNBUFFERED buffered_stdio
PYTHONVERBOSE verbose
PYTHONWARNINGS warnoptions

PYTHONLEGACYWINDOWSFSENCODINGPYTHONLEGACYWINDOWSSTDIO는 Windows에만 해당합니다.

기본 Python 구성

PyPreConfig_InitPythonConfig():

  • allocator = PYMEM_ALLOCATOR_NOT_SET
  • coerce_c_locale_warn = -1
  • coerce_c_locale = -1
  • configure_locale = 1
  • dev_mode = -1
  • isolated = 0
  • legacy_windows_fs_encoding = -1
  • use_environment = 1
  • utf8_mode = -1

PyConfig_InitPythonConfig():

  • argv = []
  • base_exec_prefix = NULL
  • base_prefix = NULL
  • buffered_stdio = 1
  • bytes_warning = 0
  • check_hash_pycs_mode = NULL
  • configure_c_stdio = 1
  • dev_mode = 0
  • dump_refs = 0
  • exec_prefix = NULL
  • executable = NULL
  • faulthandler = 0
  • filesystem_encoding = NULL
  • filesystem_errors = NULL
  • hash_seed = 0
  • home = NULL
  • import_time = 0
  • inspect = 0
  • install_signal_handlers = 1
  • interactive = 0
  • isolated = 0
  • malloc_stats = 0
  • module_search_path_env = NULL
  • module_search_paths = []
  • optimization_level = 0
  • parse_argv = 1
  • parser_debug = 0
  • pathconfig_warnings = 1
  • prefix = NULL
  • program_name = NULL
  • pycache_prefix = NULL
  • quiet = 0
  • run_command = NULL
  • run_filename = NULL
  • run_module = NULL
  • show_alloc_count = 0
  • show_ref_count = 0
  • site_import = 1
  • skip_source_first_line = 0
  • stdio_encoding = NULL
  • stdio_errors = NULL
  • tracemalloc = 0
  • use_environment = 1
  • use_hash_seed = 0
  • user_site_directory = 1
  • verbose = 0
  • warnoptions = []
  • write_bytecode = 1
  • xoptions = []
  • _init_main = 1
  • _install_importlib = 1

기본 격리 구성

PyPreConfig_InitIsolatedConfig():

  • allocator = PYMEM_ALLOCATOR_NOT_SET
  • coerce_c_locale_warn = 0
  • coerce_c_locale = 0
  • configure_locale = 0
  • dev_mode = 0
  • isolated = 1
  • legacy_windows_fs_encoding = 0
  • use_environment = 0
  • utf8_mode = 0

PyConfig_InitIsolatedConfig():

  • argv = []
  • base_exec_prefix = NULL
  • base_prefix = NULL
  • buffered_stdio = 1
  • bytes_warning = 0
  • check_hash_pycs_mode = NULL
  • configure_c_stdio = 0
  • dev_mode = 0
  • dump_refs = 0
  • exec_prefix = NULL
  • executable = NULL
  • faulthandler = 0
  • filesystem_encoding = NULL
  • filesystem_errors = NULL
  • hash_seed = 0
  • home = NULL
  • import_time = 0
  • inspect = 0
  • install_signal_handlers = 0
  • interactive = 0
  • isolated = 1
  • malloc_stats = 0
  • module_search_path_env = NULL
  • module_search_paths = []
  • optimization_level = 0
  • parse_argv = 0
  • parser_debug = 0
  • pathconfig_warnings = 0
  • prefix = NULL
  • program_name = NULL
  • pycache_prefix = NULL
  • quiet = 0
  • run_command = NULL
  • run_filename = NULL
  • run_module = NULL
  • show_alloc_count = 0
  • show_ref_count = 0
  • site_import = 1
  • skip_source_first_line = 0
  • stdio_encoding = NULL
  • stdio_errors = NULL
  • tracemalloc = 0
  • use_environment = 0
  • use_hash_seed = 0
  • user_site_directory = 0
  • verbose = 0
  • warnoptions = []
  • write_bytecode = 1
  • xoptions = []
  • _init_main = 1
  • _install_importlib = 1

Python 3.7 API

Python 3.7에는 Python을 초기화하고 종료하기 위한 C API 함수가 4개 있습니다:

  • Py_Initialize(), Py_InitializeEx(): Python을 초기화합니다
  • Py_Finalize(), Py_FinalizeEx(): Python을 종료합니다

Python 3.7은 Global Configuration VariablesEnvironment Variables, 그리고 다음 함수로 구성할 수 있습니다:

  • PyImport_AppendInittab()
  • PyImport_ExtendInittab()
  • PyMem_SetAllocator()
  • PyMem_SetupDebugHooks()
  • PyObject_SetArenaAllocator()
  • Py_SetPath()
  • Py_SetProgramName()
  • Py_SetPythonHome()
  • Py_SetStandardStreamEncoding()
  • PySys_AddWarnOption()
  • PySys_AddXOption()
  • PySys_ResetWarnOptions()

재정의할 수 있는 고수준 Py_Main() 함수와 PyImport_FrozenModules 변수도 있습니다.

Initialization, Finalization, and Threads 문서를 참조하십시오.

Python 이슈

이 PEP로 직접 또는 간접적으로 수정되는 이슈는 다음과 같습니다:

  • bpo-1195571: “Py_FatalError를 위한 간단한 콜백 시스템”
  • bpo-11320: “API 메서드 Py_SetPath 사용으로 Py_Initialize()에서 오류 발생 (Posix 전용)”
  • bpo-13533: “Py_Initialize가 호스트 앱과 원활하게 작동하기를 원함”
  • bpo-14956: “사용자 지정 PYTHONPATH가 Python을 임베드하는 앱을 손상시킬 수 있음”
  • bpo-19983: “시작 중 인터럽트가 발생한 경우 Python은 abort()를 호출하지 말고 exit()를 호출해야 함”
  • bpo-22213: “Python을 임베드할 때 pyvenv 스타일의 가상 환경을 더 쉽게 구성하도록 합니다”.
  • bpo-29778: “_Py_CheckPython3이 임베더가 Py_SetPath로 모듈 경로를 설정할 때 초기화되지 않은 dllpath를 사용합니다”
  • bpo-30560: “Py_SetFatalErrorAbortFunc를 추가하여 임베딩 프로그램이 치명적 오류를 처리할 수 있도록 합니다”.
  • bpo-31745: “”Py_GetPath” 오버로딩이 작동하지 않습니다”
  • bpo-32573: “모든 sys 속성(.argv, …)이 임베드된 환경에 존재해야 합니다”.
  • bpo-33135: “다양한 config 구조체에 대한 필드 접두사를 정의합니다”. 이제 PEP는 경고 옵션 처리 방식을 명확히 정의합니다.
  • bpo-34725: “Windows에서 Py_GetProgramFullPath()가 이상하게 동작합니다”
  • bpo-36204: “Py_Initialize() 이후 Py_Main() 호출을 더 이상 사용하지 않도록 합니까? Py_InitializeFromArgv()를 추가합니까?”

PEP 구현 관련 이슈:

  • bpo-16961: “-E 및 개별 환경 변수에 대한 회귀 테스트가 없습니다”
  • bpo-20361: “-W 명령줄 옵션과 PYTHONWARNINGS 환경 변수가 -b / -bb 명령줄 옵션을 재정의해서는 안 됩니다”
  • bpo-26122: “격리 모드가 PYTHONHASHSEED를 무시하지 않습니다”
  • bpo-29818: “Py_SetStandardStreamEncoding이 디버그 모드에서 메모리 오류를 일으킵니다”
  • bpo-31845: “PYTHONDONTWRITEBYTECODE와 PYTHONOPTIMIZE가 아무런 효과가 없습니다”
  • bpo-32030: “PEP 432: Py_Main()을 다시 작성합니다”
  • bpo-32124: “Py_Initialize() 전에 안전하게 호출할 수 있는 함수를 문서화합니다”
  • bpo-33042: “새로운 3.7 시작 시퀀스가 PyInstaller를 충돌시킵니다”
  • bpo-33932: “Py_Initialize()를 두 번 호출하면 이제 치명적 오류가 발생합니다(Python 3.7)”
  • bpo-34008: “Py_Initialize() 이후 Py_Main() 호출을 지원합니까?”
  • bpo-34170: “Py_Initialize(): 경로 구성을 계산할 때 부작용이 발생해서는 안 됩니다(PEP 432)”
  • bpo-34589: “Py_Initialize()와 Py_Main()은 C 로캘 강제 변환을 활성화해서는 안 됩니다”
  • bpo-34639: “-E 또는 -I 옵션을 사용할 때 PYTHONCOERCECLOCALE이 무시됩니다”
  • bpo-36142: “Python 초기화에 새로운 _PyPreConfig 단계를 추가하여 메모리 할당자와 인코딩을 설정합니다”
  • bpo-36202: “_PyPreConfig_Write() 전에 Py_DecodeLocale()을 호출하면 모지바케가 발생할 수 있습니다”
  • bpo-36301: “_Py_PreInitialize() 함수를 추가합니다”
  • bpo-36443: “_PyPreConfig에서 coerce_c_locale과 utf8_mode를 기본적으로 비활성화합니까?”
  • bpo-36444: “Python 초기화: _PyMainInterpreterConfig를 제거합니다”
  • bpo-36471: “PEP 432, PEP 587: _Py_RunMain()을 추가합니다”
  • bpo-36763: “PEP 587: PEP의 두 번째 버전을 준비하도록 초기화 API를 다시 작업합니다”
  • bpo-36775: “파일 시스템 코덱 구현을 다시 작업합니다”
  • bpo-36900: “_PyCoreConfig를 전역 구성 변수 대신 사용합니다”

이 PEP와 관련된 이슈:

  • bpo-12598: “sys 변수 초기화를 import.c에서 sysmodule.c로 이동합니다”
  • bpo-15577: “임베디드 인터프리터에서 실제 argc와 argv”
  • bpo-16202: “sys.path[0] 보안 문제”
  • bpo-18309: “python을 약간 더 재배치 가능하게 만듭니다”
  • bpo-22257: “PEP 432: 인터프리터 시작 시퀀스를 재설계합니다”
  • bpo-25631: “임베디드 Python에서 잘못된 유니코드 명령줄 인자로 인한 세그멘테이션 오류”
  • bpo-26007: “실행 파일에 표준 라이브러리를 임베드하는 기능을 지원합니다”
  • bpo-31210: “sys.prefix에 DELIM이 포함되어 있으면 모듈을 임포트할 수 없습니다.”
  • bpo-31349: “임베디드 초기화가 Py_SetProgramName()을 무시합니다”
  • bpo-33919: “_PyCoreConfig 구조를 Python에 노출합니다”
  • bpo-35173: “기존 기능을 재사용하여 Python 2.7.x(임베디드 및 독립 실행형 모두)가 공유 라이브러리에 따라 모듈 경로를 찾을 수 있도록 합니다”

토론

버전 기록

  • 버전 5:
    • PyInitErrorPyStatus로 이름을 변경합니다
    • PyInitError_Failed()PyStatus_Exception()으로 이름을 변경합니다
    • Py_ExitInitError()Py_ExitStatusException()으로 이름을 변경합니다
    • PyPreConfig._config_init 비공개 필드를 추가합니다.
    • Python Configuration 기본값을 수정합니다. isolated=0 및 use_environment=1로 설정하며, -1은 사용하지 않습니다.
    • “Multi-Phase Initialization Private Provisional API” 및 “Discussions” 섹션을 추가합니다.
  • 버전 4:
    • 더욱 명확하게 정의된 “Python Configuration” 및 “Isolated Configuration”을 도입합니다. 모든 매크로를 함수로 대체합니다.
    • PyPreConfig_INITPyConfig_INIT 매크로를 함수로 대체합니다.
      • PyPreConfig_InitIsolatedConfig(), PyConfig_InitIsolatedConfig()
      • PyPreConfig_InitPythonConfig(), PyConfig_InitPythonConfig()
    • PyPreConfig는 더 이상 동적 메모리를 사용하지 않으며, allocator 필드의 타입은 int가 됩니다. configure_localeparse_argv 필드를 추가합니다.
    • PyConfig: module_search_path_envpythonpath_env로 이름을 변경하고, use_module_search_pathsmodule_search_paths_set로 이름을 변경하며, programdll_path를 제거합니다.
    • Py_INIT_xxx() 매크로를 PyInitError_xxx() 함수로 대체합니다.
    • “Constant PyConfig” 섹션을 제거합니다. Py_InitializeFromArgs()Py_InitializeFromBytesArgs() 함수를 제거합니다.
  • 버전 3:
    • PyConfig: configure_c_stdioparse_argv를 추가하고, _frozenpathconfig_warnings로 이름을 변경합니다.
    • 바이트 문자열과 와이드 문자 문자열을 사용하는 함수의 이름을 변경합니다. 예를 들어 Py_PreInitializeFromWideArgs()Py_PreInitializeFromArgs()가 되고, PyConfig_SetArgv()PyConfig_SetBytesArgv()가 됩니다.
    • PyWideStringList_Insert() 함수를 추가합니다.
    • “Path configuration”, “Isolate Python”, “Python Issues” 및 “Version History” 섹션을 새로 추가합니다.
    • 이제 PyConfig_SetString()PyConfig_SetBytesString()은 구성을 첫 번째 인자로 요구합니다.
    • Py_UnixMain()Py_BytesMain()로 이름을 변경합니다.
  • 버전 2: PyConfig 메서드(예: PyConfig_Read())를 추가하고, PyWideStringList_Append()을 추가하며, PyWideCharListPyWideStringList로 이름을 변경합니다.
  • 버전 1: 최초 버전입니다.

승인

PEP 5872019년 5월 26일 Thomas Wouters가 승인했습니다.