python / python/cpython

Strange new line behavior and missing color in the iOS testbed logs

Ouverte
#150,932 10 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

OS-ios OS-mac type-bug
Langage dominant
Python
Étoiles
77.2k
Forks
35.9k
Métriques de merge des PR
Métriques de PR en attente

Description

Bug report

Bug description:

When using cibuildwheel to build and test a Python package for iOS, pytest output captured through the Apple testbed runner is difficult to read. Two distinct problems occur simultaneously:

1. Progress output is split across individual lines.

pytest emits progress characters (., F, E, s, …) without a trailing newline and flushes after each one. In the captured log each character appears on its own line instead of forming a compact progress line:

============================= test session starts ==============================
 platform ios -- Python 3.13.11, pytest-9.0.3, pluggy-1.6.0
 rootdir: /Users/timrid/Library/Developer/CoreSimulator/Devices/84EFB4EB-1C63-49FF-972C-D7276CB71115/data/Containers/Bundle/Application/3CA6642E-C9F4-4388-B444-2FA31C2AA074/iOSTestbed.app/app
 configfile: setup.cfg
 testpaths: tests/
 plugins: mock-3.15.1, cov-7.1.0, timeout-2.4.0, asyncio-1.4.0
 timeout: 120.0s
 timeout method: signal
 timeout func_only: False
 asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
 collected 4612 items / 24 deselected / 14 skipped / 4588 selected
 
 tests/test_base_protocol.py
 .
 .
 .
 .
 .
 .
 .
 .
                           [  0%]
                      [  0%]
 
 tests/test_circular_imports.py
 s
 s
 s
 s
 s [  1%]
 s
 s
 s
 s
 s
                                                             [  1%]
 
 tests/test_classbasedview.py
 .
 .
 .
 .
                                         [  1%]
 
...

The same problem affects any output that is deliberately written without a newline — e.g. print(".", end="", flush=True).

2. ANSI color codes are shown as raw escape sequences.

When color is explicitly enabled in pytest via --color=yes, pytest's colored output is not rendered. Instead, raw escape sequences appear as unreadable caret-encoded text:

\^[[1m============================= test session starts ==============================\^[[0m
 platform ios -- Python 3.13.11, pytest-9.0.3, pluggy-1.6.0
 rootdir: /Users/timrid/Library/Developer/CoreSimulator/Devices/84EFB4EB-1C63-49FF-972C-D7276CB71115/data/Containers/Bundle/Application/F9002FB8-67E9-4424-AC42-8F5807D4DB47/iOSTestbed.app/app
 configfile: setup.cfg
 testpaths: tests/
 plugins: mock-3.15.1, cov-7.1.0, timeout-2.4.0, asyncio-1.4.0
 timeout: 120.0s
 timeout method: signal
 timeout func_only: False
 asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
 collected 4612 items / 24 deselected / 14 skipped / 4588 selected
 
 tests/test_base_protocol.py
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m.\^[[0m
 \^[[32m                          [  0%]\^[[0m
 
 tests/test_circular_imports.py
 \^[[33ms\^[[0m
 \^[[33ms\^[[0m
...

Together these two issues make it very hard to interpret test results, especially in CI in combination with bad Github Actions performance on huge test outputs.

I think that this is an upstream CPython issue because the root cause is in Python's Apple system-logger redirection (Lib/_apple_support.py), which is used by the testbed runner to capture output from iOS builds.

Maybe a possible solution for problem 1 is to modify the Apple system-logger redirection in Lib/_apple_support.py to append a marker byte (e.g. 0x1f, ASCII Unit Separator) to any log message that does not end with \n. The testbed runner can then detect the marker, suppress the line break, and join the message with the next one. This would fix it without buffering output or breaking the flush() contract. To solve problem 2, the testbed runner can reverse the system log's caret encoding (\^[ etc.) back into the original control characters, restoring colored output.

@freakboy3742 What do you think?

CPython versions tested on:

3.13

Operating systems tested on:

Other

Linked PRs
  • gh-150983

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par Lib/_apple_support.py et le runner du banc de test Apple, puis reproduisez la sortie de pytest avec --color=yes et un affichage sans saut de ligne. Comparez les journaux capturés avec la sortie de progression compacte attendue et les couleurs ANSI rendues ; vérifiez le PR lié gh-150983 avant de commencer, car le travail est peut-être déjà en cours.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
ios, python
Domaine
mobile-dev, testing-qa
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.