Python 3.14.7: wide curses распознаётся даже без имени ncursesw. Практическая инструкция отделяет симптом от соседних причин: синтетический fixture, отрицательный control, таблица наблюдений, критерий остановки и минимальный пакет для поддержки без production-данных.
Узкая граница исправления
Прямой ответ относится к одной границе: Python собирает curses against wide-capable ncurses даже при другом имени библиотеки, например в pkgsrc или системной macOS-связке. Практический симптом, который надо отличить от соседних причин: Системная curses поддерживает wide characters, но её файл не называется ncursesw, поэтому сборка Python ошибочно получалась narrow и ломала ожидаемую Unicode-ветку. Поэтому статья не предлагает угадывать по названию модуля. Она отвечает на намерение «как проверить wide-character curses build, когда библиотека называется не ncursesw, в Python 3.14.7» через короткий A/B-протокол, где отрицательный control важнее совпавшего текста ошибки. Массовость проблемы и пригодность обновления для конкретного проекта источниками не установлены.
Паспорт наблюдения
Паспорт наблюдения T22-17 начинается не с обновления, а с воспроизводимого шага: зафиксировать configure output и link map, затем под pty проверить addstr/instr с одной Unicode-меткой, не полагаясь на filename библиотеки. Запускайте его в temp root, child process, pty, локальном stub или VM — в зависимости от требуемой поверхности. Назначьте лимит времени и ресурсов до старта. Сохраните только измеримые поля, а не полный environment dump; если нужная сборка, display, libc или optional module отсутствует, пометьте environment blocker и не имитируйте результат.
Сравнение без догадки
Не принимайте один удачный case. Выполните независимую ветку: провести ASCII round-trip, сравнить сборку с явно narrow library и повторить wide-case в чистой terminal session. Таблица наблюдений: «library path | detected width | configure flags | test glyph bytes | decoded result | locale | terminal restore». Сравнивайте не впечатление, а тип результата, состав данных и границы времени. Повторите отрицательный control после target-ветки; расхождение говорит о скрытом состоянии, а не об исправлении Python.
Правило зелёной ветки
Решение принимается по правилу: capability probe и Unicode round-trip подтверждают wide build независимо от basename linked library. Не путайте его с «процесс не упал» или «текст ошибки другой». Если target чист, но control не различает две гипотезы, добавьте наблюдение, а не новую статью. Если обновление меняет ещё зависимости, такой прогон не изолирует gh-154070; сначала восстановите одинаковую среду.
Красные флаги
Остановите опыт при первом условии: не делать вывод по названию файла и не менять системную curses; остановиться без pty, корректной locale или восстановления terminal. Не продолжайте после crash ради «ещё одного подтверждения». Верните среду к baseline: закройте socket/pty, уничтожьте root, завершите только созданный child, удалите temp fixture и проверьте resource inventory. Если rollback нельзя доказать, материал остаётся кандидатом и не должен публиковаться как прошедший проверку.
Минимальный тикет
Минимальный тикет состоит из: версии Python/curses, сокращённый link path, configure flags, repr одной тестовой метки и результат round-trip. Отдельно приложите строки control/target/repeat и отметьте, на какой фазе возникло отклонение. Не присылайте реальные payload, credential или полный crash dump. Такой пакет позволяет воспроизвести границу gh-154070 без доступа к вашей инфраструктуре.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #154070 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.