Source code for sertit.os_utils
import logging
import re
from functools import cmp_to_key
from pathlib import Path
from sertit import strings
from sertit.logs import SU_NAME
LOGGER = logging.getLogger(SU_NAME)
def _compare_str_containing_version(str1: str, str2: str):
"""
Compare two strings containing a software version, for example "qgis 3.34.5" and "qgis 3.35.6".
Args:
str1:
str2:
Returns:
Let's say str1 and str2 contains respectively the versions v1 and v2. So, this function returns:
-1 if v1 <= v2
0 if v1 == v2
1 if v1 >= v2
"""
from semver import Version
match_pattern = r"\d+\.\d+\.?\d+?"
v1 = Version.parse(
re.search(match_pattern, str1).group(), optional_minor_and_patch=True
)
v2 = Version.parse(
re.search(match_pattern, str2).group(), optional_minor_and_patch=True
)
if v1 == v2:
return 0
elif v1 < v2:
return -1
else:
return 1
[docs]
def qgis_bin() -> Path:
"""
Looking for qgis bin directory in Windows filesystem and return it.
Returns: None if qgis bin directory is not found or a path to the qgis bin directory otherwise.
"""
# Find QGis in ProgramFiles
qgis_dirs = []
parent_path_qgis = Path("C:/") / "Program Files"
if parent_path_qgis.exists(): # pragma: no cover
qgis_dirs = [
str(pt)
for pt in parent_path_qgis.iterdir()
if pt.stem.lower().startswith("qgis")
]
if len(qgis_dirs) > 0: # pragma: no cover
# Take the latest one available
qgis_dirs = sorted(qgis_dirs, key=cmp_to_key(_compare_str_containing_version))
qgis_valid_dirs = []
for path in qgis_dirs:
bin_path = Path(path) / "bin"
if bin_path.exists():
qgis_valid_dirs.append(bin_path)
qgis_dir = None if len(qgis_valid_dirs) == 0 else qgis_valid_dirs[-1]
# Find QGis in osgeo4w
else:
osgeo_path = Path("C:/") / "osgeo4w" / "bin"
qgis_dir = osgeo_path if osgeo_path.exists() else None
return qgis_dir
[docs]
def gdalbuildvrt_exe() -> str:
"""
Looking for gdalbuildvrt exe from the path or inside qgis bin directory.
Returns:
str: gdalbuildvrt exe
"""
qgis = qgis_bin()
if qgis is not None: # pragma: no cover
gdal_build_vrt_exe = strings.to_cmd_string(str(qgis / "gdalbuildvrt.exe"))
else:
gdal_build_vrt_exe = "gdalbuildvrt"
return gdal_build_vrt_exe