← Назад к вопросам
Как встроены внутренние библиотеки в Python?
2.0 Middle🔥 211 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Встроенные библиотеки Python: архитектура и механизмы
Встроенные (built-in) библиотеки Python — это не просто код на Python, а сложная система, состоящая из компонентов на Python, C и других языков. Разберёмся в архитектуре.
1. Типы встроенных библиотек
1.1 Pure Python библиотеки
# Написаны полностью на Python
import json
import collections
import itertools
# Можно посмотреть исходный код
import inspect
print(inspect.getsourcefile(json))
# /usr/lib/python3.9/json/__init__.py
# Посмотреть реализацию функции
print(inspect.getsource(json.dumps))
1.2 C-extensions
# Написаны на C для производительности
import sys
import pickle
import sqlite3
# C-расширения не имеют исходного кода Python
try:
print(inspect.getsource(pickle.loads))
except TypeError:
print("C extension - no source available")
1.3 Гибридные библиотеки
# Сочетание Python + C
import os
import datetime
# os содержит как Python-функции, так и C-обёртки
print(type(os.path.exists)) # <class 'builtin_function_or_method'>
2. Где хранятся встроенные библиотеки
import sys
# sys.prefix указывает на корень Python
print(sys.prefix)
# /usr (или /usr/local, или путь виртуального окружения)
# Стандартные библиотеки находятся в:
print(sys.base_prefix) # /usr
# Посмотреть все пути поиска модулей
for path in sys.path:
print(path)
# Типичный результат:
# /home/user/project (текущая директория)
# /usr/lib/python3.9
# /usr/lib/python3.9/lib-dynload
# /usr/local/lib/python3.9/site-packages
3. Структура Python Standard Library
/usr/lib/python3.9/
├── builtins.py # Встроенные типы (len, str, int)
├── json/
│ ├── __init__.py # json.dumps(), json.loads()
│ ├── encoder.py # JSONEncoder класс
│ ├── decoder.py # JSONDecoder класс
│ └── tool.py # CLI утилита
├── collections/
│ ├── __init__.py
│ ├── abc.py # Abstract base classes
│ └── defaultdict.py # Реализации
├── sqlite3.py # Pure Python обёртка
└── lib-dynload/ # Скомпилированные C расширения
├── _sqlite3.cpython-39-x86_64-linux-gnu.so
├── _json.cpython-39-x86_64-linux-gnu.so
├── _ssl.cpython-39-x86_64-linux-gnu.so
└── ...
4. Встроенные функции (builtins)
# Встроенные функции находятся в специальном модуле
import builtins
print(dir(builtins))
# ['ArithmeticError', 'AssertionError', ..., 'len', 'list', 'map', ...]
# Это C-функции, скомпилированные в интерпретатор
print(type(len)) # <class 'builtin_function_or_method'>
print(type(int)) # <class 'type'>
# Каждый объект имеет встроенные методы
my_list = [1, 2, 3]
print(type(my_list.append)) # <class 'builtin_function_or_method'>
# Посмотреть сигнатуру
help(len)
# Help on built-in function len in module builtins:
# len(obj, /)
# Return the length of an object.
5. Как Python импортирует встроенные модули
# 1. При импорте, Python проверяет sys.modules (кэш)
import sys
import os
print('os' in sys.modules) # True - уже загружен
# 2. Если не найден в кэше, Python ищет в sys.path
import importlib.util
spec = importlib.util.find_spec('json')
print(spec.origin) # /usr/lib/python3.9/json/__init__.py
# 3. Для C-расширений, Python загружает .so файл
spec = importlib.util.find_spec('_json')
print(spec.origin) # /usr/lib/python3.9/lib-dynload/_json.cpython-39-x86_64-linux-gnu.so
6. Встроенные типы данных
# Встроенные типы - это C-структуры
# list
my_list = [1, 2, 3]
print(type(my_list)) # <class 'list'>
print(my_list.__class__.__bases__) # (object,)
# dict
my_dict = {"key": "value"}
print(isinstance(my_dict, dict)) # True
# Всё наследуется от object (главный базовый класс)
print(isinstance(my_list, object)) # True
# Встроенные методы магических объектов
print(dir(my_list))
# [..., '__add__', '__contains__', '__delitem__', '__eq__', ..., 'append', 'clear', 'copy', ...]
7. sys модуль - доступ к интерпретатору
import sys
# Версия Python
print(sys.version) # 3.9.7 (default, Sep 16 2021, 13:09:58)
# Размер объекта в памяти
print(sys.getsizeof([])) # 56 bytes
print(sys.getsizeof([1, 2])) # 64 bytes
# Счётчик ссылок (reference count)
x = [1, 2, 3]
print(sys.getrefcount(x)) # 2 (сама переменная + аргумент getrefcount)
# Рекурсия
print(sys.getrecursionlimit()) # 1000
sys.setrecursionlimit(2000)
# Информация о платформе
print(sys.platform) # linux
print(sys.executable) # /usr/bin/python3
8. os модуль - системные вызовы
import os
# Переменные окружения
print(os.environ['PATH'])
print(os.getenv('USER')) # Безопаснее
# Работа с путями
print(os.getcwd()) # Текущая директория
print(os.path.exists('file.txt'))
print(os.path.join('/home', 'user', 'file.txt'))
# Системные вызовы (обёртка вокруг libc)
os.mkdir('/tmp/test') # Системный вызов mkdir()
os.remove('/tmp/test') # Системный вызов unlink()
# Информация о системе
print(os.uname()) # posix.uname_result(sysname='Linux', ...)
9. Встроенный интерпретатор кода
# compile() и exec() - встроенные функции для выполнения кода
# Компилирование Python кода
code = '''
result = 2 + 2
print(result)
'''
# Парсирование и компиляция
compiled = compile(code, '<string>', 'exec')
print(type(compiled)) # <class 'code'>
# Выполнение скомпилированного кода
exec(compiled) # 4
# Вычисление выражения
result = eval('2 + 2') # 4
10. Как C-расширения интегрируются
# Python использует Python C API для создания расширений
# Пример: сборка C-расширения (невалидный синтаксис, показано для понимания)
# C код (_mymodule.c):
"""
#include <Python.h>
static PyObject* add(PyObject* self, PyObject* args) {
int x, y;
if (!PyArg_ParseTuple(args, "ii", &x, &y))
return NULL;
return PyLong_FromLong(x + y);
}
static PyMethodDef methods[] = {
{"add", add, METH_VARARGS, "Add two integers"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT,
"_mymodule",
NULL,
-1,
methods
};
PyMODINIT_FUNC PyInit__mymodule(void) {
return PyModule_Create(&module);
}
"""
# После компиляции становится доступным:
import _mymodule
print(_mymodule.add(2, 3)) # 5
11. Встроенные модули для интроспекции
import inspect
import types
import dis
# inspect - доступ к исходному коду и сигнатурам
def my_function(x, y=10):
return x + y
sig = inspect.signature(my_function)
print(sig) # (x, y=10)
# dis - дизассемблирование (байт-код)
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
dis.dis(fibonacci)
# Показывает LOAD_FAST, LOAD_CONST, COMPARE_OP, ...
# types - для проверки типов
print(isinstance(my_function, types.FunctionType)) # True
print(isinstance(len, types.BuiltinFunctionType)) # True
12. Встроенные исключения
# Иерархия исключений - все встроены
print(BaseException.__subclasses__())
# [Exception, GeneratorExit, KeyboardInterrupt, SystemExit]
print(Exception.__subclasses__())
# [StopIteration, ArithmeticError, AssertionError, ..., ValueError, ...]
# Кастомное исключение должно наследовать Exception
class MyError(Exception):
pass
try:
raise MyError("Something went wrong")
except MyError as e:
print(e) # Something went wrong
Итоговая архитектура
Python Interpreter (CPython)
├── Built-in Functions (C)
│ ├── len(), print(), type(), ...
│ └── Находятся в исполняемом файле python
├── Built-in Types (C)
│ ├── int, str, list, dict, tuple, ...
│ └── Реализованы в Objects/ папке CPython
├── Standard Library (Python + C)
│ ├── Pure Python: json, collections, itertools
│ ├── C Extensions: _json, _sqlite3, _ssl, _pickle
│ └── Расположены в /usr/lib/pythonX.Y/
├── sys Module (C)
│ └── Доступ к интерпретатору и конфигурации
└── os Module (Python + C)
└── Системные вызовы через libc
Практический примеры использования
# 1. Как узнать, встроенный ли модуль?
import sys
from pathlib import Path
def is_builtin(module_name):
spec = sys.modules.get(module_name)
if spec is None:
return False
origin = getattr(spec, '__file__', None)
if origin is None:
return True # C-расширение
stdlib = Path(sys.prefix) / 'lib'
return str(origin).startswith(str(stdlib))
print(is_builtin('json')) # True
print(is_builtin('requests')) # False (сторонний пакет)
# 2. Профилирование встроенных функций
import cProfile
import pstats
def test():
result = sum(range(1000000))
return result
cProfile.run('test()')
# Показывает, что встроенная sum() очень быстрая
Заключение
Встроенные библиотеки Python — это сложная система, состоящая из:
- Встроенных функций и типов (написаны на C, в интерпретаторе)
- Standard Library модулей (Python + C-расширения)
- Системных вызовов через libc
Понимание того, какие части встроены на C, помогает оптимизировать код и понимать производительность Python приложений.