Skip to content

Fix PyInstaller shutdown errors on macOS#4930

Merged
cobaltt7 merged 6 commits intopsf:mainfrom
Ankitsinghsisodya:fix-pyinstaller-macos-4823
Jan 23, 2026
Merged

Fix PyInstaller shutdown errors on macOS#4930
cobaltt7 merged 6 commits intopsf:mainfrom
Ankitsinghsisodya:fix-pyinstaller-macos-4823

Conversation

@Ankitsinghsisodya
Copy link
Contributor

In frozen (PyInstaller) builds, disable multiprocessing by limiting workers to 1. This
prevents shutdown errors caused by worker processes attempting to import modules after
PyInstaller cleanup begins.

Fixes #4823

Description

When using the prebuilt Black binary on macOS (built with PyInstaller), users encounter
a FileNotFoundError for base_library.zip during shutdown. This happens because
ProcessPoolExecutor worker processes attempt to import modules after PyInstaller has
begun cleanup of the frozen environment.

The fix adds a check for sys.frozen in reformat_many() to limit workers to 1 in
frozen builds, which forces use of ThreadPoolExecutor instead of
ProcessPoolExecutor. This avoids the shutdown race condition while still allowing
Black to function correctly.

This approach mirrors the existing fallback behavior for environments that don't support
multiprocessing (like AWS Lambda or Termux).

Checklist - did you ...

  • Implement any code style changes under the --preview style, following the
    stability policy?
  • Add an entry in CHANGES.md if necessary?
  • Add / update tests if necessary?
  • Add new / update outdated documentation?

Note on tests: No automated tests can be added for this fix because the issue only
manifests in PyInstaller-frozen builds. The existing test
test_works_in_mono_process_only_environment verifies the mono-process fallback logic
works correctly.

Ankitsinghsisodya and others added 2 commits December 30, 2025 08:04
In frozen (PyInstaller) builds, disable multiprocessing by limiting
workers to 1. This prevents shutdown errors caused by worker processes
attempting to import modules after PyInstaller cleanup begins.

Fixes psf#4823
@github-actions
Copy link
Contributor

github-actions bot commented Dec 31, 2025

diff-shades results comparing this PR (c676452) to main (14713ac):

--preview style: no changes

--stable style: no changes


What is this? | Workflow run | diff-shades documentation

@cobaltt7
Copy link
Collaborator

cobaltt7 commented Jan 1, 2026

Hey @FrankPortman, are you able to test this fix? I've built the mac binary already (build logs)

(25.12.0 binary for comparison)

Copilot AI review requested due to automatic review settings January 23, 2026 02:37
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes a shutdown-time import race in PyInstaller-frozen Black binaries (notably on macOS) by preventing ProcessPoolExecutor usage in frozen environments.

Changes:

  • In reformat_many(), detect frozen builds via sys.frozen and force workers = 1 to avoid multiprocessing workers.
  • Add a packaging changelog entry describing the PyInstaller shutdown fix.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
src/black/concurrency.py Forces single-worker execution in frozen builds to avoid ProcessPoolExecutor shutdown/import issues.
CHANGES.md Documents the PyInstaller/frozen-build shutdown fix under Packaging.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Ankitsinghsisodya and others added 3 commits January 23, 2026 08:26
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This reverts commit c676452.
@cobaltt7
Copy link
Collaborator

Fuzz error is unrelated to this PR

@cobaltt7 cobaltt7 merged commit 5cdb4b6 into psf:main Jan 23, 2026
53 of 54 checks passed
cobaltt7 added a commit to cobaltt7/black that referenced this pull request Feb 21, 2026
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: cobalt <61329810+cobaltt7@users.noreply.github.com>
@davehughes
Copy link

Hey @FrankPortman, are you able to test this fix? I've built the mac binary already (build logs)

(25.12.0 binary for comparison)

Hopefully better late than never - I'm @FrankPortman's teammate and I can confirm that the fix works for me in our Bazel environment. Thank you!

luketainton pushed a commit to luketainton/repos_webexmemebot that referenced this pull request Mar 6, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [black](https://github.com/psf/black) ([changelog](https://github.com/psf/black/blob/main/CHANGES.md)) | `<26.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

<details>
<summary>psf/black (black)</summary>

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/repos/webexmemebot/pulls/571
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_pypilot that referenced this pull request Mar 6, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [black](https://github.com/psf/black) ([changelog](https://github.com/psf/black/blob/main/CHANGES.md)) | `<26.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

<details>
<summary>psf/black (black)</summary>

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/repos/pypilot/pulls/421
Reviewed-by: Luke Tainton <luke@tainton.uk>
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/luke_instant-msg-api that referenced this pull request Mar 6, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [black](https://github.com/psf/black) ([changelog](https://github.com/psf/black/blob/main/CHANGES.md)) | `<26.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

<details>
<summary>psf/black (black)</summary>

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/luke/instant-msg-api/pulls/246
Reviewed-by: Luke Tainton <luke@tainton.uk>
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_epage that referenced this pull request Mar 6, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [black](https://github.com/psf/black) ([changelog](https://github.com/psf/black/blob/main/CHANGES.md)) | `<26.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

<details>
<summary>psf/black (black)</summary>

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/repos/epage/pulls/208
Reviewed-by: Luke Tainton <luke@tainton.uk>
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_PwnedPW that referenced this pull request Mar 6, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [black](https://github.com/psf/black) ([changelog](https://github.com/psf/black/blob/main/CHANGES.md)) | `<26.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

<details>
<summary>psf/black (black)</summary>

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsibGludGluZyJdfQ==-->

Reviewed-on: https://git.tainton.uk/repos/PwnedPW/pulls/326
Reviewed-by: Luke Tainton <luke@tainton.uk>
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_roboluke that referenced this pull request Mar 6, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [black](https://github.com/psf/black) ([changelog](https://github.com/psf/black/blob/main/CHANGES.md)) | `<26.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

<details>
<summary>psf/black (black)</summary>

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/repos/roboluke/pulls/431
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PyInstaller related issue when using the prebuilt Black binary on Mac OSX

4 participants