Title: [Bug]: TkAgg fails to find Tcl/Tk libraries in Windows for processes with a large number of modules loaded · Issue #22378 · matplotlib/matplotlib · GitHub
Open Graph Title: [Bug]: TkAgg fails to find Tcl/Tk libraries in Windows for processes with a large number of modules loaded · Issue #22378 · matplotlib/matplotlib
X Title: [Bug]: TkAgg fails to find Tcl/Tk libraries in Windows for processes with a large number of modules loaded · Issue #22378 · matplotlib/matplotlib
Description: Bug summary When trying to use the TkAgg backend in a Windows process (a Python process itself or another process with Python embedded) that has a large number of modules loaded (over 1024), the following exception might get raised. Runt...
Open Graph Description: Bug summary When trying to use the TkAgg backend in a Windows process (a Python process itself or another process with Python embedded) that has a large number of modules loaded (over 1024), the fo...
X Description: Bug summary When trying to use the TkAgg backend in a Windows process (a Python process itself or another process with Python embedded) that has a large number of modules loaded (over 1024), the fo...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/22378
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: TkAgg fails to find Tcl/Tk libraries in Windows for processes with a large number of modules loaded","articleBody":"### Bug summary\n\nWhen trying to use the `TkAgg` backend in a Windows process (a Python process itself or another process with Python embedded) that has a large number of modules loaded (over 1024), the following exception might get raised.\r\n\r\n RuntimeError: Failed to load Tcl_SetVar\n\n### Code for reproduction\n\n```python\n# Within a Windows process with a large number of modules loaded\r\nimport matplotlib as mpl\r\nmpl.use('TkAgg')\n```\n\n\n### Actual outcome\n\nLoading the TkAgg backend fails with the following error:\r\n\r\n RuntimeError: Failed to load Tcl_SetVar\n\n### Expected outcome\n\nThe TkAgg backend loads correctly.\n\n### Additional information\n\nThe reason for this error is that the function [`load_tkinter_funcs`](https://github.com/matplotlib/matplotlib/blob/v3.5.1/src/_tkagg.cpp#L257-L278), which iterates through each module loaded by the process in search of the ones containing Tcl and Tk functions, calls [`EnumProcessModules`](https://docs.microsoft.com/windows/win32/api/psapi/nf-psapi-enumprocessmodules) with an output array with a fixed size of 1024. If the process has more than 1024 modules loaded, some of them will not be inspected, and so the code may fail to find it.\r\n\r\nInstead, as explained by the documentation of [`EnumProcessModules`](https://docs.microsoft.com/windows/win32/api/psapi/nf-psapi-enumprocessmodules), the returned needed array size should be checked:\r\n\r\n\u003e To determine if the _lphModule_ array is too small to hold all module handles for the process, compare the value returned in _lpcbNeeded_ with the value specified in _cb_. If _lpcbNeeded_ is greater than _cb_, increase the size of the array and call **EnumProcessModules** again.\r\n\r\nThis implies using dynamically allocated memory. Alternatively, the size of the array could be increased further and hope this pushes away the problem far enough.\r\n\r\nIn any case, the current code is not safe, as it iterates the array a number of times depending on the needed size, so if that value is greater than the size of the array, the code will accessing memory out of the boundaries of the array. It should only iterate up to the smaller of the needed size and the actual size.\n\n### Operating system\n\nWindows 10\n\n### Matplotlib Version\n\n3.4.2\n\n### Matplotlib Backend\n\nTkAgg\n\n### Python version\n\n3.7.7\n\n### Jupyter version\n\n_No response_\n\n### Installation\n\npip","author":{"url":"https://github.com/javidcf","@type":"Person","name":"javidcf"},"datePublished":"2022-02-02T17:37:19.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/22378/matplotlib/issues/22378"}
| 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:18e67fba-bd36-02ca-fa1a-2bf6a53e3a68 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | D31C:2C65A3:3478447:4765E21:6A53EE81 |
| html-safe-nonce | addbfe595ba883b40ebb80aa8f438f538f0d8fc53c860da76b93a2d577ea30a7 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEMzFDOjJDNjVBMzozNDc4NDQ3OjQ3NjVFMjE6NkE1M0VFODEiLCJ2aXNpdG9yX2lkIjoiMzc1ODI1ODA5NTU5NzU0NzEzOCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 12b7534033cec91b47fa974c8b635d73e825503a91ea96a32dd1bc37d5058c22 |
| hovercard-subject-tag | issue:1122209191 |
| 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/matplotlib/matplotlib/22378/issue_layout |
| twitter:image | https://opengraph.githubassets.com/acb65d465783afb6352b0235581aaf9d43a52d48927029b6d201875bc11aed27/matplotlib/matplotlib/issues/22378 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/acb65d465783afb6352b0235581aaf9d43a52d48927029b6d201875bc11aed27/matplotlib/matplotlib/issues/22378 |
| og:image:alt | Bug summary When trying to use the TkAgg backend in a Windows process (a Python process itself or another process with Python embedded) that has a large number of modules loaded (over 1024), the fo... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | javidcf |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| 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 | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width