Python 3.14.7: createcommand больше не удерживает удалённый Tcl interpreter. Практическая инструкция отделяет симптом от соседних причин: синтетический fixture, отрицательный control, таблица наблюдений, критерий остановки и минимальный пакет для поддержки без production-данных.
Узкая граница исправления
Прямой ответ относится к одной границе: Команда createcommand больше не держит interpreter через reference cycle, если её не удалили до уничтожения interpreter. Практический симптом, который надо отличить от соседних причин: Tcl command, созданная через createcommand, не удалена вручную и удерживает callback вместе с interpreter, поэтому серия коротких GUI-задач постепенно накапливает объекты. Поэтому статья не предлагает угадывать по названию модуля. Она отвечает на намерение «как проверить отсутствие reference cycle после tkinter createcommand и удаления interpreter в Python 3.14.7» через короткий A/B-протокол, где отрицательный control важнее совпавшего текста ошибки. Массовость проблемы и пригодность обновления для конкретного проекта источниками не установлены.
Паспорт наблюдения
Паспорт наблюдения T22-12 начинается не с обновления, а с воспроизводимого шага: в цикле с малым фиксированным числом создать Tcl interpreter, callback с weakref-маркером, createcommand, затем удалить все внешние ссылки и выполнить gc.collect. Запускайте его в temp root, child process, pty, локальном stub или VM — в зависимости от требуемой поверхности. Назначьте лимит времени и ресурсов до старта. Сохраните только измеримые поля, а не полный environment dump; если нужная сборка, display, libc или optional module отсутствует, пометьте environment blocker и не имитируйте результат.
Сравнение без догадки
Не принимайте один удачный case. Выполните независимую ветку: сравнить ветку с явным deletecommand, ветку без createcommand и целевую ветку с неявной очисткой при одинаковом числе циклов. Таблица наблюдений: «ветка | циклы | weakref alive | gc collected | число Tcl commands до destroy | RSS delta как справочная величина». Сравнивайте не впечатление, а тип результата, состав данных и границы времени. Повторите отрицательный control после target-ветки; расхождение говорит о скрытом состоянии, а не об исправлении Python.
Правило зелёной ветки
Решение принимается по правилу: после gc weakref-маркеры освобождены во всех ветках, а целевая ветка не оставляет растущий список interpreter/callback объектов. Не путайте его с «процесс не упал» или «текст ошибки другой». Если target чист, но control не различает две гипотезы, добавьте наблюдение, а не новую статью. Если обновление меняет ещё зависимости, такой прогон не изолирует gh-80937; сначала восстановите одинаковую среду.
Красные флаги
Остановите опыт при первом условии: не делать вывод по одному RSS и не запускать бесконечный цикл; остановиться при незакрытом GUI resource или росте вне заданного допуска. Не продолжайте после crash ради «ещё одного подтверждения». Верните среду к baseline: закройте socket/pty, уничтожьте root, завершите только созданный child, удалите temp fixture и проверьте resource inventory. Если rollback нельзя доказать, материал остаётся кандидатом и не должен публиковаться как прошедший проверку.
Минимальный тикет
Минимальный тикет состоит из: версия Python/Tk, число циклов, weakref counts до/после gc, наличие explicit cleanup в control и агрегированный RSS без dump памяти. Отдельно приложите строки control/target/repeat и отметьте, на какой фазе возникло отклонение. Не присылайте реальные payload, credential или полный crash dump. Такой пакет позволяет воспроизвести границу gh-80937 без доступа к вашей инфраструктуре.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #80937 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.