Skip to content

fix(integrations): skip Windows Store python3 alias stub in resolve_python_interpreter#3385

Open
marcelsafin wants to merge 3 commits into
github:mainfrom
marcelsafin:fix/3383-windows-python-stub
Open

fix(integrations): skip Windows Store python3 alias stub in resolve_python_interpreter#3385
marcelsafin wants to merge 3 commits into
github:mainfrom
marcelsafin:fix/3383-windows-python-stub

Conversation

@marcelsafin

Copy link
Copy Markdown
Contributor

Description

Fixes #3383

IntegrationBase.resolve_python_interpreter picked python3/python by existence on PATH (shutil.which). On stock Windows, python3 resolves to the Microsoft Store App Execution Alias stub, which exists but only prints an installer hint and exits non-zero. Every generated {SCRIPT} invocation for the py script type was therefore broken on that machine state, while the guaranteed-live sys.executable fallback sat unreached.

Root cause: the same existence-vs-runtime defect #3304 documents for the sh scripts (assessed valid, severity medium there); the fixes in #3312 and #3320 covered common.sh but not this Python resolver.

Fix: on Windows only, verify the found interpreter with a [path, "-c", ""] run before accepting it, and fall through to the next candidate (then sys.executable) when it fails. POSIX has no App Execution Alias, so it keeps the plain existence check and spawns nothing — a regression test asserts that. The run check lives in a small _interpreter_runs helper with a timeout and OSError guard.

Testing

  • Tested locally with uv run specify --help
  • Ran existing tests with uv sync && uv run pytest — 3776 passed, 105 skipped
  • Tested with a sample project (if applicable)

Four regression tests in TestResolvePythonInterpreter: stub rejected → sys.executable, working interpreter accepted, stub python3 falling through to a working python, and POSIX never spawning the run check. The first three fail on main.

AI Disclosure

  • I did not use AI assistance for this contribution
  • I did use AI assistance (describe below)

Bug found, patch and tests written with GitHub Copilot CLI; reproduction and full test suite run and verified locally by me. I do not have a Windows machine in this environment; the Windows behavior is covered by the monkeypatched tests and matches the machine state documented in #3304.

…ython_interpreter

On stock Windows, python3 on PATH is the Microsoft Store App Execution
Alias stub: it exists but only prints an installer hint and exits
non-zero, so generated {SCRIPT} invocations for the py script type were
broken. Verify the found interpreter actually runs before accepting it,
on Windows only, mirroring the parse-success-not-availability approach
of github#3312/github#3320 for the sh scripts. POSIX keeps the plain existence
check. sys.executable remains the fallback and is always live.

Fixes github#3383

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@marcelsafin marcelsafin requested a review from mnriem as a code owner July 6, 2026 23:18
Copilot AI review requested due to automatic review settings July 6, 2026 23:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes Windows-specific interpreter resolution in IntegrationBase.resolve_python_interpreter by avoiding the Microsoft Store “App Execution Alias” python3/python stubs that exist on PATH but fail at runtime, ensuring {SCRIPT} invocations for the py script type remain runnable.

Changes:

  • Add a Windows-only runtime probe for python3/python candidates found via shutil.which, falling through when the candidate cannot execute.
  • Introduce _interpreter_runs() helper (subprocess + timeout) to validate candidates on Windows.
  • Add regression tests covering stub rejection, successful acceptance, fallthrough from python3python, and ensuring POSIX does not spawn a probe.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
src/specify_cli/integrations/base.py Adds Windows-only runtime validation to skip python3/python alias stubs and fall back to sys.executable.
tests/integrations/test_base.py Adds targeted regression tests for Windows stub behavior and confirms POSIX keeps existence-based resolution without subprocess checks.

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

Comment on lines +599 to +603
subprocess.run(
[path, "-c", ""],
capture_output=True,
timeout=15,
).returncode

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in 5ddcbf1. The probe now runs [path, "-I", "-S", "-c", ""] with all three streams on DEVNULL: -I isolates it from user site-packages and environment hooks, -S skips site entirely, and the discarded I/O keeps it a pure liveness check. A real interpreter still exits 0 under those flags; the Store stub still fails.

…rd I/O

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0 new
  • Review effort level: Low

The tests fake shutil.which with POSIX paths; on Windows CI the real
sys.platform made the stub probe run against those fake paths and
fall through to sys.executable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 2/2 changed files
  • Comments generated: 0 new
  • Review effort level: Low

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.

Bug: resolve_python_interpreter returns the Windows Store python3 alias stub, generating broken {SCRIPT} invocations

3 participants