Python 3.14.7: Popen не падает, если __fspath__ меняет argv. Практическая проверка отделяет симптом от соседних причин: безопасный fixture, опровергающий control, измеримая развилка, стоп-линия и минимальный пакет для поддержки.
Как распознать именно этот случай
Запрос ограничен формулировкой «как проверить subprocess.Popen при изменении args внутри __fspath__ на Python 3.14.7». Наблюдаемый симптом: объект пути в argv мутирует исходную последовательность во время конвертации и вызывает use-after-free или crash вместо обычной ошибки. Официально подтверждена более узкая граница: исправлен crash в subprocess.Popen и fork_exec, когда __fspath__ элемента одновременно меняет args. Это не означает, что любой похожий crash, warning, hang или неверный результат вызван именно этой ошибкой. Сначала запишите точную версию Python, режим сборки, платформу и один ожидаемый переход состояния; обновление всей среды не должно быть первым действием.
Изолированный опыт
Для паспорта T21-12 выполните только такой опыт: в child process передать Popen список с синтетическим PathLike, чей __fspath__ удаляет только собственный элемент, а команда указывает на безвредный interpreter -c pass. Входы должны быть синтетическими, а рискованный код — жить в отдельном child process, контейнере, pty или temp root. До запуска задайте deadline, лимит памяти и допустимые файлы. Не используйте реальные архивы, токены, адреса, пользовательские документы или production PID. Если нужный backend, libc, compiler или GUI недоступен, зафиксируйте environment blocker: это честнее, чем имитировать результат.
Что должно опровергнуть гипотезу
Опровергающая ветка: неизменяющий PathLike и отдельный PathLike с embedded NUL, который обязан завершиться Python exception без запуска команды. Наблюдения пишутся строго как «вариант PathLike | длина argv до/после | child exit code | signal | exception class | команда запущена». Сначала выполните control A, затем проблемный case B, полностью пересоздайте fixture и повторите A2. Если A2 расходится с A, опыт загрязнён cache, locale, descriptor, signal state или environment. Пустая ячейка не равна нулю, а текст exception не заменяет его класс. Такое разделение не позволяет объявить исправление только потому, что один запуск случайно не упал.
Развилки результата
Зелёная ветка разрешена только когда мутация сообщает RuntimeError или иную Python-level ошибку без signal, неизменяющий control запускается, NUL control не стартует. Если оба варианта ведут себя одинаково плохо, чините fixture, а не Python. Если control чист, но симптом не воспроизводится, итог — not reproduced в конкретной конфигурации, не доказательство отсутствия дефекта вообще. Сравнение 3.14.6 и 3.14.7 допустимо лишь с одинаковым input и limits. Результат относится к issue-boundary, а не к скорости, безопасности или совместимости всего приложения.
Когда немедленно остановиться
Стоп-линия: разрешать только локальную команду -c pass и прекратить опыт при любом дочернем процессе вне test cgroup. Остановитесь также при записи вне temp root, внешнем сетевом запросе, появлении приватных данных, неконтролируемом descendant process или превышении deadline. Не получайте зелёный статус отключением проверок, catch-all обработчиком, бесконечным retry или повышением лимитов после сбоя. Возврат должен быть проверяемым: дождаться child, удалить temp directory и убедиться, что процесс-команда больше не существует. После этого ещё раз снимите process/file inventory и убедитесь, что состояние совпало с baseline.
Что можно передать дальше
Для issue #151403 достаточно передать: минимальный PathLike, три длины argv, exception class, signal/exit code и платформа без абсолютных путей. Добавьте московский timestamp, labels A/B/A2 и точный критерий «{topic['green']}». Абсолютные пути, PIDs, hostnames, environment dumps, core dumps и содержимое рабочих файлов удалите или замените метками. Официальные источники подтверждают изменение «{topic['boundary']}», но не популярность запроса, позиции в поиске или готовность вашей системы. Такой пакет позволяет повторить один переход без доступа к инфраструктуре.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #151403 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.