Skip to content

feat: fall back to system Python when pre-built binaries unavailable#1289

Open
gounthar wants to merge 1 commit intoactions:mainfrom
gounthar:feat/system-python-fallback
Open

feat: fall back to system Python when pre-built binaries unavailable#1289
gounthar wants to merge 1 commit intoactions:mainfrom
gounthar:feat/system-python-fallback

Conversation

@gounthar
Copy link

Summary

When pre-built Python binaries are not available for the current architecture, fall back to system Python instead of failing with an error.

This enables setup-python to work on architectures like riscv64 that don't yet have pre-built binaries in actions/python-versions. RISC-V self-hosted runners are becoming available through programs like RISE RISC-V runners, used by numpy, llama.cpp, and pytorch.

Changes

  • src/find-python.ts: Before throwing "version not found" error, check if system python3 exists and satisfies the requested version spec. If so, use it and emit a warning.

Behavior

  • No change for architectures with pre-built binaries (x86_64, arm64, etc.)
  • On unsupported architectures (riscv64, etc.): uses system Python if version matches, warns user
  • Still fails if system Python doesn't satisfy the version spec

Test plan

  • Builds successfully (npm run build)
  • Verify on riscv64 self-hosted runner with system Python 3.12

Fixes #1288

When pre-built Python binaries are not available for the current
architecture (e.g., riscv64), try using system Python as a fallback
instead of failing with an error.

This enables setup-python to work on architectures that don't yet
have pre-built binaries in actions/python-versions, such as riscv64
self-hosted runners. The fallback only activates when:
1. No cached version is found
2. No manifest entry exists for the architecture
3. System python3 exists and satisfies the requested version spec

A warning is emitted so users know the fallback was used.

Fixes actions#1288

Signed-off-by: Bruno Verachten <gounthar@gmail.com>
@gounthar gounthar requested a review from a team as a code owner March 18, 2026 14:48
Copilot AI review requested due to automatic review settings March 18, 2026 14:48
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

This PR adds a fallback path in actions/setup-python so that when no pre-built CPython binary can be found for the requested version/architecture, the action can optionally use a compatible system python3 instead of failing (targeting unsupported architectures like riscv64).

Changes:

  • Add system python3 fallback resolution in useCpythonVersion when toolcache + manifest lookup fails.
  • Emit a warning when falling back to system Python.
  • Update the bundled dist output to include the same logic.

Reviewed changes

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

File Description
src/find-python.ts Adds system python3 fallback when no cached/downloadable CPython is found.
dist/setup/index.js Compiled distribution output reflecting the new fallback behavior.

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

Comment on lines +125 to +151
if (!installDir) {
// Try system Python as fallback (e.g., on architectures without pre-built binaries)
try {
const {exitCode, stdout} = await exec.getExecOutput('python3', [
'-c',
'import sys; print(sys.prefix)'
]);
if (exitCode === 0) {
const systemPrefix = stdout.trim();
const systemVersion = await exec.getExecOutput('python3', [
'-c',
'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")'
]);
if (
systemVersion.exitCode === 0 &&
semver.satisfies(systemVersion.stdout.trim(), semanticVersionSpec)
) {
installDir = systemPrefix;
core.warning(
`Pre-built Python not available for architecture '${architecture}'. Using system Python ${systemVersion.stdout.trim()} at ${systemPrefix}.`
);
}
}
} catch {
// System Python not available, fall through to error
}
}
Comment on lines +125 to +146
if (!installDir) {
// Try system Python as fallback (e.g., on architectures without pre-built binaries)
try {
const {exitCode, stdout} = await exec.getExecOutput('python3', [
'-c',
'import sys; print(sys.prefix)'
]);
if (exitCode === 0) {
const systemPrefix = stdout.trim();
const systemVersion = await exec.getExecOutput('python3', [
'-c',
'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")'
]);
if (
systemVersion.exitCode === 0 &&
semver.satisfies(systemVersion.stdout.trim(), semanticVersionSpec)
) {
installDir = systemPrefix;
core.warning(
`Pre-built Python not available for architecture '${architecture}'. Using system Python ${systemVersion.stdout.trim()} at ${systemPrefix}.`
);
}
Comment on lines +130 to +144
'import sys; print(sys.prefix)'
]);
if (exitCode === 0) {
const systemPrefix = stdout.trim();
const systemVersion = await exec.getExecOutput('python3', [
'-c',
'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")'
]);
if (
systemVersion.exitCode === 0 &&
semver.satisfies(systemVersion.stdout.trim(), semanticVersionSpec)
) {
installDir = systemPrefix;
core.warning(
`Pre-built Python not available for architecture '${architecture}'. Using system Python ${systemVersion.stdout.trim()} at ${systemPrefix}.`
Comment on lines +125 to +151
if (!installDir) {
// Try system Python as fallback (e.g., on architectures without pre-built binaries)
try {
const {exitCode, stdout} = await exec.getExecOutput('python3', [
'-c',
'import sys; print(sys.prefix)'
]);
if (exitCode === 0) {
const systemPrefix = stdout.trim();
const systemVersion = await exec.getExecOutput('python3', [
'-c',
'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")'
]);
if (
systemVersion.exitCode === 0 &&
semver.satisfies(systemVersion.stdout.trim(), semanticVersionSpec)
) {
installDir = systemPrefix;
core.warning(
`Pre-built Python not available for architecture '${architecture}'. Using system Python ${systemVersion.stdout.trim()} at ${systemPrefix}.`
);
}
}
} catch {
// System Python not available, fall through to error
}
}
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.

Add riscv64 architecture support

2 participants