python/proxyV4/worker.py (41 lines of code) (raw):
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
import os
import pathlib
import sys
PKGS_PATH = "/home/site/wwwroot/.python_packages"
PKGS = "lib/site-packages"
# Azure environment variables
AZURE_WEBSITE_INSTANCE_ID = "WEBSITE_INSTANCE_ID"
AZURE_CONTAINER_NAME = "CONTAINER_NAME"
AZURE_WEBJOBS_SCRIPT_ROOT = "AzureWebJobsScriptRoot"
def is_azure_environment():
"""Check if the function app is running on the cloud"""
return (AZURE_CONTAINER_NAME in os.environ
or AZURE_WEBSITE_INSTANCE_ID in os.environ)
def validate_python_version():
minor_version = sys.version_info[1]
if not (13 <= minor_version < 14):
raise RuntimeError(f'Unsupported Python version: 3.{minor_version}')
def determine_user_pkg_paths():
"""This finds the user packages when function apps are running on the cloud
User packages are defined in:
/home/site/wwwroot/.python_packages/lib/site-packages
"""
usr_packages_path = [os.path.join(PKGS_PATH, PKGS)]
return usr_packages_path
def add_script_root_to_sys_path():
"""Append function project root to module finding sys.path"""
functions_script_root = os.getenv(AZURE_WEBJOBS_SCRIPT_ROOT)
if functions_script_root is not None:
sys.path.append(functions_script_root)
if __name__ == '__main__':
validate_python_version()
func_worker_dir = str(pathlib.Path(__file__).absolute().parent)
env = os.environ
# Setting up python path for all environments to prioritize
# third-party user packages over worker packages in PYTHONPATH
user_pkg_paths = determine_user_pkg_paths()
joined_pkg_paths = os.pathsep.join(user_pkg_paths)
env['PYTHONPATH'] = f'{joined_pkg_paths}:{func_worker_dir}'
project_root = os.path.abspath(os.path.dirname(__file__))
if project_root not in sys.path:
sys.path.append(project_root)
if is_azure_environment():
os.execve(sys.executable,
[sys.executable, '-m', 'proxy_worker']
+ sys.argv[1:],
env)
else:
add_script_root_to_sys_path()
from proxy_worker import start_worker
start_worker.start()