Title: Emscripten: Improve standard stream handling in node_entry.mjs · Issue #146416 · python/cpython · GitHub
Open Graph Title: Emscripten: Improve standard stream handling in node_entry.mjs · Issue #146416 · python/cpython
X Title: Emscripten: Improve standard stream handling in node_entry.mjs · Issue #146416 · python/cpython
Description: The standard streams that Emscripten provides out of the box have the following deficiencies: The emscripten std streams always have isatty set to true, whereas they should reflect isatty for the node std streams. The emscripten std stre...
Open Graph Description: The standard streams that Emscripten provides out of the box have the following deficiencies: The emscripten std streams always have isatty set to true, whereas they should reflect isatty for the n...
X Description: The standard streams that Emscripten provides out of the box have the following deficiencies: The emscripten std streams always have isatty set to true, whereas they should reflect isatty for the n...
Opengraph URL: https://github.com/python/cpython/issues/146416
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Emscripten: Improve standard stream handling in node_entry.mjs","articleBody":"The standard streams that Emscripten provides out of the box have the following deficiencies:\n\n1. The emscripten std streams always have isatty set to true, whereas they should reflect isatty for the node std streams.\n2. The emscripten std streams don't support the ttygetwinsize ioctl so `shutil.get_terminal_size()` doesn't work.\n3. The emscripten std streams introduce an extra layer of buffering which has\n to be flushed with fsync().\n4. The emscripten std streams are slow and complex because they go through a\n character-based handler layer. This is particularly awkward because both\n sides of this character based layer deal with buffers and so we need\n complex adaptors, buffering, etc on both sides. Removing this\n character-based middle layer makes everything better.\n https://github.com/emscripten-core/emscripten/blob/1aa7fb531f11e11e7ae49b75a24e1a8fe6fa4a7d/src/lib/libtty.js?plain=1#L104-L114\n\nThese issues are fixed in Pyodide in this file:\nhttps://github.com/pyodide/pyodide/blob/main/src/js/streams.ts\nWe can fix it with an adapted version of that file.\n\nInspired by the discussion of terminal coloring here:\nhttps://github.com/python/buildmaster-config/pull/687#issuecomment-4125063497\nThe Emscripten build bot was coloring the output but other build bots don't. The reason was tracked down to the incorrect behavior of isatty because if isatty(stdout) is false, unittest will automatically disable terminal coloring. So this will fix the build bot. \n\n\u003c!-- gh-linked-prs --\u003e\n### Linked PRs\n* gh-146417\n* gh-146630\n\u003c!-- /gh-linked-prs --\u003e\n","author":{"url":"https://github.com/hoodmane","@type":"Person","name":"hoodmane"},"datePublished":"2026-03-25T13:08:49.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/146416/cpython/issues/146416"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:7f0437be-0127-3e2b-b9d7-823db8cc5267 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | CB7E:18F0F4:CBCDB:10A315:6A5172D0 |
| html-safe-nonce | 4a49f6e01c39d976d75de99e3089e2d5d999cb643914842bc4ab78a82555a635 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQjdFOjE4RjBGNDpDQkNEQjoxMEEzMTU6NkE1MTcyRDAiLCJ2aXNpdG9yX2lkIjoiNTkyNjU0ODI0NDUxMTQyMTEzNiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | fbfd00690db1194e1d52b6380c0745aa2b3213631b074c0dd07044e19ee45a1a |
| hovercard-subject-tag | issue:4135317808 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/146416/issue_layout |
| twitter:image | https://opengraph.githubassets.com/8a47d47a44b04406545796475999e33a7a3c7dd96536a6625784fbffa39efd01/python/cpython/issues/146416 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/8a47d47a44b04406545796475999e33a7a3c7dd96536a6625784fbffa39efd01/python/cpython/issues/146416 |
| og:image:alt | The standard streams that Emscripten provides out of the box have the following deficiencies: The emscripten std streams always have isatty set to true, whereas they should reflect isatty for the n... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | hoodmane |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | b19955a9dd40fd99462443f7911b522d7216776a |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width