Skip to content

Commit 9c7d7bd

Browse files
committed
Add startup code to worker
1 parent 5bdf20c commit 9c7d7bd

File tree

1 file changed

+64
-2
lines changed

1 file changed

+64
-2
lines changed

python/prod/worker.py

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,66 @@
1-
from azure_functions_worker import main
1+
import os
2+
import sys
3+
import platform
4+
import subprocess
5+
from pathlib import Path
6+
7+
# User packages
8+
PKGS_PATH = "site/wwwroot/.python_packages"
9+
VENV_PKGS_PATH = "site/wwwroot/worker_venv"
10+
11+
PKGS_36 = "lib/python3.6/site-packages"
12+
PKGS = "lib/site-packages"
13+
14+
# Azure environment variables
15+
AZURE_WEBSITE_INSTANCE_ID = "WEBSITE_INSTANCE_ID"
16+
AZURE_CONTAINER_NAME = "CONTAINER_NAME"
17+
18+
19+
def is_azure_environment():
20+
return (AZURE_CONTAINER_NAME in os.environ or
21+
AZURE_WEBSITE_INSTANCE_ID in os.environ)
22+
23+
24+
def determine_user_pkg_paths():
25+
minor_version = sys.version_info[1]
26+
27+
home = Path.home()
28+
pkgs_path = os.path.join(home, PKGS_PATH)
29+
venv_pkgs_path = os.path.join(home, VENV_PKGS_PATH)
30+
31+
user_pkg_paths = []
32+
if minor_version == 6:
33+
user_pkg_paths.append(os.path.join(venv_pkgs_path, PKGS_36))
34+
user_pkg_paths.append(os.path.join(pkgs_path, PKGS_36))
35+
user_pkg_paths.append(os.path.join(pkgs_path, PKGS))
36+
elif minor_version == 7:
37+
user_pkg_paths.append(os.path.join(pkgs_path, PKGS))
38+
else:
39+
raise RuntimeError(f'Unsupported Python version: 3.{minor_version}')
40+
41+
return user_pkg_paths
42+
243

344
if __name__ == '__main__':
4-
main.main()
45+
user_pkg_paths = []
46+
if is_azure_environment():
47+
user_pkg_paths = determine_user_pkg_paths()
48+
49+
env = os.environ
50+
# worker.py lives in the same directory as azure_functions_worker
51+
func_worker_dir = str(Path(__file__).absolute().parent)
52+
53+
if platform.system() == 'Windows':
54+
joined_pkg_paths = ";".join(user_pkg_paths)
55+
env['PYTHONPATH'] = f'{joined_pkg_paths};{func_worker_dir}'
56+
# execve doesn't work in Windows: https://bugs.python.org/issue19124
57+
subprocess.run([sys.executable,
58+
'-m', 'azure_functions_worker'] + sys.argv[1:],
59+
env=env)
60+
else:
61+
joined_pkg_paths = ":".join(user_pkg_paths)
62+
env['PYTHONPATH'] = f'{joined_pkg_paths}:{func_worker_dir}'
63+
os.execve(sys.executable,
64+
[sys.executable, '-m', 'azure_functions_worker']
65+
+ sys.argv[1:],
66+
env)

0 commit comments

Comments
 (0)