Skip to content

gh-161788: Handle path-like commands in shutil.which() - #161789

Merged
vstinner merged 1 commit into
python:mainfrom
SankofaForge:fix/shutil-which-pathlike
Nov 14, 2026
Merged

vstinner merged 1 commit into
python:mainfrom
SankofaForge:fix/shutil-which-pathlike

Conversation

@Builder106

@Builder106 Builder106 commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

Resolve cmd with os.fspath() before shutil.which() decides whether to use text or bytes paths. This makes bytes-backed path-like commands behave like direct bytes commands and preserves the existing return type.

The regression test runs through the existing text and bytes TestWhich variants.

Tests

All 240 tests passed; 52 platform-specific tests were skipped on Linux ARM64.

Resolve command objects through the path protocol before selecting text or
bytes handling. This preserves the documented bytes return type for
path-like objects backed by bytes.

Ref python#161788

@picnixz picnixz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think we ever actually accepted path-like objects for shutil.which() btw. So this is not an issue and rather a new feature. However, I don't think it's correct to accept pathlike because of the way we treat bytes for now. shutil.which(s: T) returns an object type T and returning a bytes instead of a path of bytes seems also wrong.

@bedevere-app

bedevere-app Bot commented Nov 11, 2026

Copy link
Copy Markdown

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

Comment thread Lib/shutil.py Resolved
Comment thread Lib/test/test_shutil.py
rv = shutil.which(self.file, path=self.dir)
self.assertEqual(rv, self.filepath)

def test_pathlike_cmd(self):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Good: this test is run on Unicode string (TestWhich) and bytes string (TestWhichBytes).

@vstinner vstinner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM.

But it seems like @picnixz would prefer a different fix.

@picnixz

picnixz commented Nov 14, 2026

Copy link
Copy Markdown
Member

But it seems like @picnixz would prefer a different fix.

Honestly, it doesn't matter since it would be about maybe relying on some non-common details (I think it's documented but having an explicit call to os.fspath() is also fine and clearer). So I don't mind merging this is as is.

@vstinner
vstinner merged commit b968417 into python:main Nov 14, 2026
65 of 67 checks passed
@vstinner

Copy link
Copy Markdown
Member

Ok, fine, I merged the PR as it is!

Thanks @Builder106 for your fix!

@vstinner

Copy link
Copy Markdown
Member

I consider that this change adds a new feature: support path-like objects which return bytes. So I don't think that it should be backported to stable branches: we don't backport new features.

@picnixz

picnixz commented Nov 14, 2026

Copy link
Copy Markdown
Member

Yes, I think it's a new feature as well.

@picnixz

picnixz commented Nov 14, 2026

Copy link
Copy Markdown
Member

Oh maybe, we should reword the NEWS entry and add a versionchanged:: next actually. We had that entry for the bytes support.

@picnixz

picnixz commented Nov 14, 2026

Copy link
Copy Markdown
Member

@Builder106 Can you open a follow-up PR to fix the formulation of the NEWS entry and update the docs actually please?

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.

4 participants