73 lines
2.0 KiB
Python
73 lines
2.0 KiB
Python
import os
|
|
import logging
|
|
from typing import Optional, Dict
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def get_path() -> Optional[str]:
|
|
"""
|
|
Get the PATH environment variable with pyapp-related paths filtered out.
|
|
|
|
This is necessary when running as a pyapp binary to prevent the bundled
|
|
Python from interfering with system tools.
|
|
|
|
Returns:
|
|
str or None: The filtered PATH string (or original PATH if not in PYAPP environment),
|
|
or None if PATH is not set
|
|
"""
|
|
# If not in PYAPP environment, return original PATH
|
|
if "PYAPP" not in os.environ:
|
|
return os.environ.get("PATH")
|
|
|
|
# If PATH is not set, return None
|
|
if "PATH" not in os.environ:
|
|
return None
|
|
|
|
logger.debug(
|
|
"Binary environment detected, filtering internal Python path from PATH"
|
|
)
|
|
|
|
original_path = os.environ["PATH"]
|
|
path_parts = original_path.split(os.pathsep)
|
|
|
|
filtered_paths = []
|
|
removed_paths = []
|
|
|
|
for path in path_parts:
|
|
path_lower = path.lower()
|
|
if "pyapp" in path_lower and "safety" in path_lower:
|
|
removed_paths.append(path)
|
|
logger.debug(f"Removing internal Python path from PATH: {path}")
|
|
else:
|
|
filtered_paths.append(path)
|
|
|
|
if removed_paths:
|
|
filtered_path = os.pathsep.join(filtered_paths)
|
|
logger.info(f"Filtered {len(removed_paths)} internal Python path(s) from PATH")
|
|
logger.debug(
|
|
f"Original PATH entries: {len(path_parts)}, Filtered PATH entries: {len(filtered_paths)}"
|
|
)
|
|
return filtered_path
|
|
|
|
return original_path
|
|
|
|
|
|
def get_env() -> Dict[str, str]:
|
|
"""
|
|
Get a copy of the environment with pyapp-related paths filtered from PATH.
|
|
|
|
This is useful for subprocess calls to prevent the bundled Python from
|
|
interfering with system tools.
|
|
|
|
Returns:
|
|
dict: A copy of os.environ with filtered PATH
|
|
"""
|
|
env = os.environ.copy()
|
|
filtered_path = get_path()
|
|
|
|
if filtered_path is not None:
|
|
env["PATH"] = filtered_path
|
|
|
|
return env
|