Title: File IO issues · Issue #547 · RustPython/RustPython · GitHub
Open Graph Title: File IO issues · Issue #547 · RustPython/RustPython
X Title: File IO issues · Issue #547 · RustPython/RustPython
Description: There a few differences between the way CPython handles file IO and the way RustPython does. RustPython does not currently offer any close() methods, opened files get leaked and can be closed only by invoking os.close(file.raw.fileno) (o...
Open Graph Description: There a few differences between the way CPython handles file IO and the way RustPython does. RustPython does not currently offer any close() methods, opened files get leaked and can be closed only ...
X Description: There a few differences between the way CPython handles file IO and the way RustPython does. RustPython does not currently offer any close() methods, opened files get leaked and can be closed only ...
Opengraph URL: https://github.com/RustPython/RustPython/issues/547
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"File IO issues","articleBody":"There a few differences between the way CPython handles file IO and the way RustPython does.\r\n\r\n1. RustPython does not currently offer any `close()` methods, opened files get leaked and can be closed only by invoking `os.close(file.raw.fileno)` (or `os.close(file.buffer.raw.fileno)` for files in text mode) after importing the `os` module.\r\n2. RustPython currently doesn’t offer text writing mode (which is the default for writing in CPython), so in CPython:\r\n ```python3\r\n \u003e\u003e\u003e file = open('/tmp/tst', 'w')\r\n \u003e\u003e\u003e file\r\n \u003c_io.TextIOWrapper name='/tmp/tst' mode='w' encoding='UTF-8'\u003e\r\n ```\r\n one can try to open a file for text writing in RustPython with `wt` mode, but then writing fails:\r\n ```python3\r\n \u003e\u003e\u003e\u003e\u003e file = open('/tmp/tst', 'wt')\r\n \u003e\u003e\u003e\u003e\u003e file.write('\\ntest string')\r\n Traceback (most recent call last):\r\n File \u003cstdin\u003e, line 0, in \u003cmodule\u003e\r\n AttributeError: 'TextIOWrapper' object has no attribute 'write'\r\n ```\r\n and files for writing are by default opened in binary mode.\r\n3. RustPython’s `fileno` is a property, while in CPython it is a *method* returning the underlying file descriptor.\r\n4. CPython **doesn’t** rely on the `fileno()` value for file interactions, instead it uses [internal file handle](https://github.com/python/cpython/blob/bcda8f1d42a98d9022736dd52d855be8e220fe15/Modules/_io/fileio.c#L58) while [`fileno()` just returns it as a Python `int`](https://github.com/python/cpython/blob/bcda8f1d42a98d9022736dd52d855be8e220fe15/Modules/_io/fileio.c#L543-L556), so one can modify it, and the file object will still be referring to the original file:\r\n ```python3\r\n \u003e\u003e\u003e file = open('/tmp/test', 'wb')\r\n \u003e\u003e\u003e file.write(b'writing to the original file\\n')\r\n 29\r\n \u003e\u003e\u003e file.raw.fileno = lambda: 1 # stdout descriptor\r\n \u003e\u003e\u003e file.write(b'again writing to the original file\\n')\r\n 35\r\n \u003e\u003e\u003e \r\n ```\r\n while in RustPython, changing the `fileno` property changes the underlying file:\r\n ```python3\r\n \u003e\u003e\u003e\u003e\u003e file = open('/tmp/test', 'wb')\r\n \u003e\u003e\u003e\u003e\u003e file.write(b'writing to the original file\\n')\r\n 29\r\n \u003e\u003e\u003e\u003e\u003e file.raw.fileno = 1 # stdout descriptor\r\n \u003e\u003e\u003e\u003e\u003e file.write(b'this will appear in the stdout instead\\n')\r\n this will appear in the stdout instead\r\n 39\r\n \u003e\u003e\u003e\u003e\u003e \r\n ```\r\n5. Some file attributes in CPython are protected from modifications, eg.:\r\n ```python3\r\n \u003e\u003e\u003e file = open('/tmp/test', 'wb')\r\n \u003e\u003e\u003e file.raw.mode = 'rb'\r\n Traceback (most recent call last):\r\n File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\r\n AttributeError: attribute 'mode' of '_io.FileIO' objects is not writable\r\n ```\r\n\r\nAnd then there are some attributes missing (eg. RustPython files do not have a `mode` attribute at all). \r\n\r\nThe first three issues seem easy to fix, but the 4. and 5. need changes in the way RustPython handles objects (they mostly behave like regular Python objects, but need custom payload and properties protected from being overwritten).","author":{"url":"https://github.com/silmeth","@type":"Person","name":"silmeth"},"datePublished":"2019-02-25T20:37:22.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/547/RustPython/issues/547"}
| 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:45778d36-c2d8-0151-d1be-b73db17b128e |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 93C2:6464A:278A928:38ACC43:6A58F7CF |
| html-safe-nonce | 8180250955557280d7bcdcf1f48113c35f1bfb56e42e748221067abecd2bc90a |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5M0MyOjY0NjRBOjI3OEE5Mjg6MzhBQ0M0Mzo2QTU4RjdDRiIsInZpc2l0b3JfaWQiOiI0MjkzMTk3OTE3Mjg3MTUxNTY3IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 9d513ce5732552f81c7896bc2a84c83b99bff3d118adcf11ed45001249671ab0 |
| hovercard-subject-tag | issue:414295719 |
| 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/RustPython/RustPython/547/issue_layout |
| twitter:image | https://opengraph.githubassets.com/b62fd6b145eddbccfee518995b5cd3a38b073623c24fca1a95b75a30f129ec38/RustPython/RustPython/issues/547 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/b62fd6b145eddbccfee518995b5cd3a38b073623c24fca1a95b75a30f129ec38/RustPython/RustPython/issues/547 |
| og:image:alt | There a few differences between the way CPython handles file IO and the way RustPython does. RustPython does not currently offer any close() methods, opened files get leaked and can be closed only ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | silmeth |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5f2a0c7865178af3d91dd9f13b0cdfc3c73a2529c873d2780bb4c01271a57ec6 |
| turbo-cache-control | no-preview |
| go-import | github.com/RustPython/RustPython git https://github.com/RustPython/RustPython.git |
| octolytics-dimension-user_id | 39710557 |
| octolytics-dimension-user_login | RustPython |
| octolytics-dimension-repository_id | 135201145 |
| octolytics-dimension-repository_nwo | RustPython/RustPython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 135201145 |
| octolytics-dimension-repository_network_root_nwo | RustPython/RustPython |
| 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 | 8aae7b8d6caacacf5c66eaeb2702d8dc88d85b4a |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width