Run func worker natively on Python 3.13 by disabling dependency isolation

Replace the Python 3.12 redirect workaround with the proper fix:
set PYTHON_ISOLATE_WORKER_DEPENDENCIES=0 on Python >=3.13.

The segfault (exit code 139) is caused by the Azure Functions worker's
module isolation mechanism conflicting with protobuf's C extensions
(google._upb) on Python 3.13.  Disabling isolation lets the worker
load dependencies from the app's own environment, which avoids the
crash while keeping everything running on Python 3.13.

See: https://github.com/Azure/azure-functions-python-worker/issues/1797

Co-authored-by: larohra <41490930+larohra@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-02-26 19:52:06 +00:00
Unverified
parent 29fd8e690d
commit 5532dffec2
2 changed files with 7 additions and 57 deletions
@@ -350,35 +350,6 @@ def _load_and_validate_env() -> None:
)
def _find_func_worker_python() -> str | None:
"""Find a Python 3.10-3.12 executable for the Azure Functions worker.
The Azure Functions Core Tools worker may segfault on Python >=3.13 due to
protobuf/grpcio C extension compatibility issues (``google._upb`` crash).
This returns a path to a compatible Python interpreter so the function host
can use it instead of the default (which is the test runner's Python).
Returns ``None`` when the current interpreter is already compatible or no
alternative can be found.
"""
if sys.version_info < (3, 13):
return None # Current Python is compatible; no override needed.
# Check for an explicit override first (e.g. set by CI).
explicit = os.environ.get("FUNC_WORKER_PYTHON", "").strip()
if explicit and Path(explicit).is_file():
return explicit
# Try versioned system executables (python3.12, python3.11, python3.10).
# Azure Functions v4 supports Python 3.103.12.
for minor in range(12, 9, -1):
path = shutil.which(f"python3.{minor}")
if path:
return path
return None
def _start_function_app(sample_path: Path, port: int) -> subprocess.Popen[Any]:
"""Start a function app in the specified sample directory.
@@ -390,15 +361,13 @@ def _start_function_app(sample_path: Path, port: int) -> subprocess.Popen[Any]:
# use the task hub name to separate orchestration state.
env["TASKHUB_NAME"] = f"test{uuid.uuid4().hex[:8]}"
# The Azure Functions Python worker may crash on Python >=3.13 with a
# SIGSEGV in the protobuf C extension (google._upb). Point the worker at
# a compatible Python when one is available.
worker_python = _find_func_worker_python()
if worker_python:
# Azure Functions uses double-underscore separators for nested config
# keys passed as environment variables (host.json equivalent:
# languageWorkers.python.defaultExecutablePath).
env["languageWorkers__python__defaultExecutablePath"] = worker_python
# The Azure Functions Python worker's dependency isolation mechanism crashes
# on Python 3.13 with a SIGSEGV in the protobuf C extension (google._upb).
# Disabling isolation lets the worker load dependencies from the app's own
# environment, which avoids the crash.
# See: https://github.com/Azure/azure-functions-python-worker/issues/1797
if sys.version_info >= (3, 13):
env.setdefault("PYTHON_ISOLATE_WORKER_DEPENDENCIES", "0")
# On Windows, use CREATE_NEW_PROCESS_GROUP to allow proper termination
# shell=True only on Windows to handle PATH resolution