# 매우 고수준 계층

이 장의 함수들은 파일이나 버퍼에 제공된 파이썬 소스 코드를 실행할 수 있도록 하지만, 인터프리터와 더 세밀한 방식으로 상호 작용하도록 하지는 않습니다.

이러한 함수 중 일부는 문법의 시작 기호를 매개 변수로 받아들입니다. 사용 가능한 시작 기호는 `Py_eval_input`, `Py_file_input` 및 `Py_single_input`입니다. 이것들은 이들을 매개 변수로 받아들이는 함수 뒤에 설명됩니다.

또한 이 함수 중 일부는 `FILE*` 매개 변수를 취합니다. 주의해서 다루어야 할 한 가지 문제는 다른 C 라이브러리의 `FILE` 구조체가 다르고, 호환되지 않을 수 있다는 것입니다. (적어도) 윈도우에서는, 동적으로 링크된 확장에서 실제로 다른 라이브러리를 사용할 수 있어서, `FILE*` 매개 변수가 파이썬 런타임이 사용하고 있는 것과 같은 라이브러리에서 만들어진 것이 확실할 때만 이러한 함수에 전달되도록 주의해야 합니다.

int `Py_Main`(int argc, wchar_t **argv)

  표준 인터프리터의 메인 프로그램. 이것은 파이썬을 내장하는 프로그램을 위해 제공됩니다. argc와 argv 매개 변수는 C 프로그램의 `main()` 함수에 전달되는 것과 정확히 일치하도록 준비해야 합니다 (사용자의 로케일에 따라 wchar_t로 변환됩니다). 인자 목록이 수정될 수 있음에 유의해야 합니다 (하지만 인자 목록이 가리키는 문자열의 내용은 수정되지 않습니다). 인터프리터가 정상적으로 (즉, 예외 없이) 종료되면 반환 값은 `0`, 예외로 인해 인터프리터가 종료되면 `1`, 매개 변수 목록이 유효한 파이썬 명령 줄을 나타내지 않으면 `2`가 됩니다.

  처리되지 않은 `SystemExit`가 발생하면, 이 함수는 `Py_InspectFlag`가 설정되어 있지 않은 한 `1`을 반환하지 않고 프로세스를 종료함에 유의하십시오.

int `Py_BytesMain`(int argc, char **argv)

  `Py_Main()`과 유사하지만 argv는 바이트 문자열의 배열입니다.

  버전 3.8에 추가.

int `PyRun_AnyFile`(FILE *fp, const char *filename)

  아래 `PyRun_AnyFileExFlags()` 의 단순화된 인터페이스입니다. closeit은 `0`으로 flags는 `NULL`로 설정된 상태로 남겨둡니다.

int `PyRun_AnyFileFlags`(FILE *fp, const char *filename, PyCompilerFlags *flags)

  아래 `PyRun_AnyFileExFlags()` 의 단순화된 인터페이스입니다. 이것은 closeit 인자를 `0`으로 설정된 상태로 남겨둡니다.

int `PyRun_AnyFileEx`(FILE *fp, const char *filename, int closeit)

  아래 `PyRun_AnyFileExFlags()` 의 단순화된 인터페이스입니다. 이것은 flags 인자를 `NULL`로 설정된 상태로 남겨둡니다.

int `PyRun_AnyFileExFlags`(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)

  fp가 대화식 장치(콘솔이나 터미널 입력이나 유닉스 의사 터미널)와 연결된 파일을 가리키면, `PyRun_InteractiveLoop()`의 값을 반환하고, 그렇지 않으면 `PyRun_SimpleFile()`의 결과를 반환합니다. filename은 파일 시스템 인코딩(`sys.getfilesystemencoding()`)으로 디코딩됩니다. filename이 `NULL`이면, 이 함수는 파일명으로 `"???"`를 사용합니다.

int `PyRun_SimpleString`(const char *command)

  아래 `PyRun_SimpleStringFlags()` 의 단순화된 인터페이스입니다. `PyCompilerFlags`* 인자를 `NULL`로 설정된 상태로 남겨둡니다.

int `PyRun_SimpleStringFlags`(const char *command, PyCompilerFlags *flags)

  flags 인자에 따라 `__main__` 모듈에서 command에 있는 파이썬 소스 코드를 실행합니다. `__main__`이 존재하지 않으면 만듭니다. 성공하면 `0`을, 예외가 발생하면 `-1`을 반환합니다. 에러가 있으면, 예외 정보를 얻을 방법이 없습니다. flags의 의미는 아래를 참조하십시오.

  처리되지 않은 `SystemExit`가 발생하면, 이 함수는 `Py_InspectFlag`가 설정되어 있지 않은 한 `-1`을 반환하지 않고 프로세스를 종료함에 유의하십시오.

int `PyRun_SimpleFile`(FILE *fp, const char *filename)

  아래 `PyRun_SimpleFileExFlags()` 의 단순화된 인터페이스입니다. closeit을 `0`으로, flags를 `NULL`로 설정된 상태로 남겨둡니다.

int `PyRun_SimpleFileEx`(FILE *fp, const char *filename, int closeit)

  아래 `PyRun_SimpleFileExFlags()` 의 단순화된 인터페이스입니다. flags를 `NULL`로 설정된 상태로 남겨둡니다.

int `PyRun_SimpleFileExFlags`(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)

  `PyRun_SimpleStringFlags()` 와 비슷하지만, 메모리에 있는 문자열 대신 fp에서 파이썬 소스 코드를 읽습니다. filename은 파일의 이름이어야 하며, 파일 시스템 인코딩(`sys.getfilesystemencoding()`)으로 디코딩됩니다. closeit이 참이면 PyRun_SimpleFileExFlags 가 반환하기 전에 파일이 닫힙니다.

  참고

  윈도우에서, fp는 바이너리 모드로 열어야 합니다 (예를 들어 `fopen(filename, "rb")`). 그렇지 않으면, 파이썬은 LF 줄 종료가 있는 스크립트 파일을 올바르게 처리하지 못할 수 있습니다.

int `PyRun_InteractiveOne`(FILE *fp, const char *filename)

  아래 `PyRun_InteractiveOneFlags()` 의 단순화된 인터페이스입니다. flags를 `NULL`로 설정된 상태로 남겨둡니다.

int `PyRun_InteractiveOneFlags`(FILE *fp, const char *filename, PyCompilerFlags *flags)

  flags 인자에 따라 대화식 장치와 연관된 파일에서 단일 문장을 읽고 실행합니다. `sys.ps1`과 `sys.ps2`를 사용하여 사용자에게 프롬프트 합니다. filename은 파일 시스템 인코딩(`sys.getfilesystemencoding()`)으로 디코딩됩니다.

  입력이 성공적으로 실행될 때 `0`을, 예외가 있으면 `-1`을, 또는 구문 분석 에러가 있으면 파이썬의 일부로 배포된 `errcode.h` 인클루드 파일에 있는 에러 코드를 반환합니다. (`errcode.h`는 `Python.h`에서 인클루드하지 않기 때문에 필요하면 특별히 인클루드해야 함에 유의하십시오.)

int `PyRun_InteractiveLoop`(FILE *fp, const char *filename)

  아래 `PyRun_InteractiveLoopFlags()` 의 단순화된 인터페이스입니다. flags를 `NULL`로 설정된 상태로 남겨둡니다.

int `PyRun_InteractiveLoopFlags`(FILE *fp, const char *filename, PyCompilerFlags *flags)

  EOF에 도달할 때까지 대화식 장치와 연관된 파일에서 문장을 읽고 실행합니다. `sys.ps1`과 `sys.ps2`를 사용하여 사용자에게 프롬프트 합니다. filename은 파일 시스템 인코딩(`sys.getfilesystemencoding()`)으로 디코딩됩니다. EOF에서 `0`을 반환하거나, 실패하면 음수를 반환합니다.

int `(*PyOS_InputHook)`(void)

  프로토타입 `int func(void)`인 함수를 가리키도록 설정할 수 있습니다. 이 함수는 파이썬의 인터프리터 프롬프트가 유휴 상태가 되고 터미널에서 사용자 입력을 기다리려고 할 때 호출됩니다. 반환 값은 무시됩니다. 이 훅을 재정의하는 것은 파이썬 소스 코드의 `Modules/_tkinter.c`에서 한 것처럼 인터프리터의 프롬프트를 다른 이벤트 루프와 통합하는 데 사용될 수 있습니다.

char* `(*PyOS_ReadlineFunctionPointer)`(FILE *, FILE *, const char *)

  프로토타입 `char *func(FILE *stdin, FILE *stdout, char *prompt)`인 함수를 가리키도록 설정하여, 인터프리터의 프롬프트에서 단일 입력 줄을 읽는 데 사용되는 기본 함수를 재정의할 수 있습니다. 이 함수는 `NULL`이 아니면 문자열 prompt를 출력한 다음 제공된 표준 입력 파일에서 입력 줄을 읽고 결과 문자열을 반환할 것이라고 기대됩니다. 예를 들어, `readline` 모듈은 이 훅을 설정하여 줄 편집과 탭 완성 기능을 제공합니다.

  결과는 `PyMem_RawMalloc()`이나 `PyMem_RawRealloc()`으로 할당된 문자열 이거나, 에러가 발생했으면 `NULL`이어야 합니다.

  버전 3.4에서 변경: 결과는 `PyMem_Malloc()`이나 `PyMem_Realloc()`으로 할당하는 대신, `PyMem_RawMalloc()`이나 `PyMem_RawRealloc()`으로 할당해야 합니다.

struct _node* `PyParser_SimpleParseString`(const char *str, int start)

  아래 `PyParser_SimpleParseStringFlagsFilename()`의 단순화된 인터페이스입니다. filename을 `NULL`로, flags를 `0`으로 설정된 상태로 남겨둡니다.

struct _node* `PyParser_SimpleParseStringFlags`(const char *str, int start, int flags)

  아래 `PyParser_SimpleParseStringFlagsFilename()`의 단순화된 인터페이스입니다. 이것은 filename을 `NULL`로 설정된 상태로 남겨둡니다.

struct _node* `PyParser_SimpleParseStringFlagsFilename`(const char *str, const char *filename, int start, int flags)

  flags 인자에 따라 시작 토큰 start를 사용하여 str에서 파이썬 소스 코드를 구문 분석합니다. 결과는 효율적으로 평가될 수 있는 코드 객체를 생성하는 데 사용될 수 있습니다. 코드 조각을 여러 번 평가해야 하는 경우에 유용합니다. filename은 파일 시스템 인코딩(`sys.getfilesystemencoding()`)으로 디코딩됩니다.

struct _node* `PyParser_SimpleParseFile`(FILE *fp, const char *filename, int start)

  아래 `PyParser_SimpleParseFileFlags()` 의 단순화된 인터페이스입니다. flags를 `0`으로 설정된 상태로 남겨둡니다.

struct _node* `PyParser_SimpleParseFileFlags`(FILE *fp, const char *filename, int start, int flags)

  `PyParser_SimpleParseStringFlagsFilename()`와 유사하지만, 파이썬 소스 코드는 메모리에 있는 문자열 대신 fp에서 읽습니다.

PyObject* `PyRun_String`(const char *str, int start, PyObject *globals, PyObject *locals)
  Return value: New reference.

  아래 `PyRun_StringFlags()`의 단순화된 인터페이스입니다. 이것은 flags를 `NULL`로 설정된 상태로 남겨둡니다.

PyObject* `PyRun_StringFlags`(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
  Return value: New reference.

  flags로 지정된 컴파일러 플래그를 사용하여 globals과 locals 객체로 지정된 컨텍스트에서 str에서 파이썬 소스 코드를 실행합니다. globals는 딕셔너리이어야 합니다. locals는 매핑 프로토콜을 구현하는 모든 객체가 될 수 있습니다. 매개 변수 start는 소스 코드를 구문 분석하는 데 사용해야 하는 시작 토큰을 지정합니다.

  코드를 실행한 결과를 파이썬 객체로 반환하거나, 예외가 발생하면 `NULL`을 반환합니다.

PyObject* `PyRun_File`(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
  Return value: New reference.

  아래 `PyRun_FileExFlags()`의 단순화된 인터페이스입니다. closeit을 `0`으로, flags를 `NULL`로 설정된 상태로 남겨둡니다.

PyObject* `PyRun_FileEx`(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)
  Return value: New reference.

  아래 `PyRun_FileExFlags()`의 단순화된 인터페이스입니다. flags를 `NULL`로 설정된 상태로 남겨둡니다.

PyObject* `PyRun_FileFlags`(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
  Return value: New reference.

  아래 `PyRun_FileExFlags()`의 단순화된 인터페이스입니다. closeit을 `0`으로 설정된 상태로 남겨둡니다.

PyObject* `PyRun_FileExFlags`(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags)
  Return value: New reference.

  `PyRun_StringFlags()`와 유사하지만, 파이썬 소스 코드는 메모리에 있는 문자열 대신 fp에서 읽습니다. filename은 파일명이어야 하며 파일 시스템 인코딩(`sys.getfilesystemencoding()`)으로 디코딩됩니다. closeit이 참이면 `PyRun_FileExFlags()`가 반환되기 전에 파일이 닫힙니다.

PyObject* `Py_CompileString`(const char *str, const char *filename, int start)
  Return value: New reference.

  아래 `Py_CompileStringFlags()` 의 단순화된 인터페이스입니다. flags를 `NULL`로 설정된 상태로 유지합니다.

PyObject* `Py_CompileStringFlags`(const char *str, const char *filename, int start, PyCompilerFlags *flags)
  Return value: New reference.

  아래 `Py_CompileStringExFlags()` 의 단순화된 인터페이스입니다. optimize를 `-1`로 설정된 상태로 유지합니다.

PyObject* `Py_CompileStringObject`(const char *str, PyObject *filename, int start, PyCompilerFlags *flags, int optimize)
  Return value: New reference.

  str에 있는 파이썬 소스 코드를 구문 분석하고 컴파일하여 결과 코드 객체를 반환합니다. 시작 토큰은 start로 주어집니다; 이것은 컴파일될 수 있는 코드를 제한하는 데 사용될 수 있으며 `Py_eval_input`, `Py_file_input` 또는 `Py_single_input`이어야 합니다. filename으로 지정된 파일명은 코드 객체를 구성하는 데 사용되며 트레이스백이나 `SyntaxError` 예외 메시지에 나타날 수 있습니다. 코드를 구문 분석할 수 없거나 컴파일할 수 없으면 `NULL`을 반환합니다.

  정수 optimize는 컴파일러의 최적화 수준을 지정합니다. `-1` 값은 `-O` 옵션으로 주어진 것처럼 인터프리터의 최적화 수준을 선택합니다. 명시적 수준은 `0` (최적화 없음; `__debug__`가 참), `1` (어서션이 제거되고 `__debug__`가 거짓) 또는 `2` (독스트링도 제거됩니다)입니다.

  버전 3.4에 추가.

PyObject* `Py_CompileStringExFlags`(const char *str, const char *filename, int start, PyCompilerFlags *flags, int optimize)
  Return value: New reference.

  `Py_CompileStringObject()`와 유사하지만, filename은 파일 시스템 인코딩(`os.fsdecode()`)으로 디코딩된 바이트 문자열입니다.

  버전 3.2에 추가.

PyObject* `PyEval_EvalCode`(PyObject *co, PyObject *globals, PyObject *locals)
  Return value: New reference.

  이것은 코드 객체와 전역 변수 및 지역 변수만 있는, `PyEval_EvalCodeEx()`의 단순화된 인터페이스입니다. 다른 인자는 `NULL`로 설정됩니다.

PyObject* `PyEval_EvalCodeEx`(PyObject *co, PyObject *globals, PyObject *locals, PyObject *const *args, int argcount, PyObject *const *kws, int kwcount, PyObject *const *defs, int defcount, PyObject *kwdefs, PyObject *closure)
  Return value: New reference.

  주어진 평가를 위한 특정 환경에서, 미리 컴파일된 코드 객체를 평가합니다. 이 환경은 전역 변수의 딕셔너리, 지역 변수의 매핑 객체, 인자의 배열, 키워드와 기본값, 키워드 전용 인자의 기본값 딕셔너리 및 셀의 클로저 튜플로 구성됩니다.

`PyFrameObject`

  프레임 객체를 기술하는 데 사용되는 객체의 C 구조체. 이 형의 필드는 언제든지 변경될 수 있습니다.

PyObject* `PyEval_EvalFrame`(PyFrameObject *f)
  Return value: New reference.

  실행 프레임을 평가합니다. 이전 버전과의 호환성을 위한, `PyEval_EvalFrameEx()`의 단순화된 인터페이스입니다.

PyObject* `PyEval_EvalFrameEx`(PyFrameObject *f, int throwflag)
  Return value: New reference.

  이것은 파이썬 인터프리트의 메인, 꾸미지 않은 함수입니다. 실행 프레임 f와 연관된 코드 객체가 실행됩니다. 필요에 따라 바이트 코드를 해석하고 호출을 실행합니다. 추가 throwflag 매개 변수는 대체로 무시할 수 있습니다 - 참이면, 예외가 즉시 발생하도록 합니다; 제너레이터 객체의 `throw()` 메서드에 사용됩니다.

  버전 3.4에서 변경: 이 함수는 이제 활성 예외를 조용히 버리지 않았는지 확인하도록 도우려고 디버그 어서션을 포함합니다.

int `PyEval_MergeCompilerFlags`(PyCompilerFlags *cf)

  이 함수는 현재 평가 프레임의 플래그를 변경하고, 성공하면 참을, 실패하면 거짓을 반환합니다.

int `Py_eval_input`

  격리된 표현식을 위한 파이썬 문법의 시작 기호; `Py_CompileString()`과 함께 사용합니다.

int `Py_file_input`

  파일이나 다른 소스에서 읽은 문장의 시퀀스를 위한 파이썬 문법의 시작 기호; `Py_CompileString()`과 함께 사용합니다. 임의로 긴 파이썬 소스 코드를 컴파일할 때 사용하는 기호입니다.

int `Py_single_input`

  단일 문장을 위한 파이썬 문법의 시작 기호; `Py_CompileString()`과 함께 사용합니다. 대화식 인터프리터 루프에 사용되는 기호입니다.

struct `PyCompilerFlags`

  이것은 컴파일러 플래그를 담는 데 사용되는 구조체입니다. 코드가 컴파일되기만 하는 경우 `int flags`로 전달되고, 코드가 실행되는 경우 `PyCompilerFlags *flags`로 전달됩니다. 이 경우, `from __future__ import`는 flags를 수정할 수 있습니다.

  `PyCompilerFlags *flags`가 `NULL`일 때마다, `cf_flags`는 `0`과 같다고 취급되며, `from __future__ import`로 인한 수정은 버립니다.

  int `cf_flags`

    컴파일러 플래그.

  int `cf_feature_version`

    cf_feature_version은 부 파이썬 버전입니다. `PY_MINOR_VERSION`으로 초기화되어야 합니다.

    이 필드는 기본적으로 무시되며, `PyCF_ONLY_AST` 플래그가 cf_flags에 설정된 경우에만 사용됩니다.

  버전 3.8에서 변경: cf_feature_version 필드를 추가했습니다.

int `CO_FUTURE_DIVISION`

  flags에서 이 비트를 설정하면 PEP 238에 따라 나누기 연산자 `/`를 《실수 나누기(true division)》로 해석되도록 합니다.