88# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights
99# not expressly granted therein are reserved by Shotgun Software Inc.
1010
11+ import contextlib
1112import os
1213import sys
13- import contextlib
14-
15- if sys .version_info [0 :2 ] >= (3 , 10 ):
16- from setuptools ._distutils .version import LooseVersion
17- else :
18- from distutils .version import LooseVersion
1914
2015import sgtk
2116import sgtk .util
2217from sgtk import TankError
2318from sgtk .platform .qt import QtCore , QtGui
2419
25- from .util import apply_version_to_setting , get_clean_version_string
26- from .util import clear_dll_directory , restore_dll_directory
2720from .prepare_apps import prepare_launch_for_engine
21+ from .util import (
22+ apply_version_to_setting ,
23+ clear_dll_directory ,
24+ get_clean_version_string ,
25+ restore_dll_directory ,
26+ )
2827
2928
3029class BaseLauncher (object ):
@@ -50,6 +49,28 @@ def __init__(self):
5049 else "mac" if sgtk .util .is_macos () else "windows"
5150 )
5251
52+ try :
53+ from packaging import version
54+
55+ self .version_parse = version .parse
56+ except ModuleNotFoundError :
57+ try :
58+ from distutils .version import LooseVersion
59+
60+ self .version_parse = LooseVersion
61+ except ModuleNotFoundError :
62+ try :
63+ from setuptools ._distutils .version import LooseVersion
64+
65+ self .version_parse = LooseVersion
66+ except ModuleNotFoundError :
67+ # Fall back to string comparison
68+ self .version_parse = str
69+ self ._tk_app .log_debug (
70+ "Modules packaging or distutils not found in the Python environment, "
71+ "falling back to string comparison."
72+ )
73+
5374 def _register_launch_command (
5475 self ,
5576 app_menu_name ,
@@ -504,10 +525,13 @@ def _sort_versions(self, versions):
504525 except AttributeError :
505526 ctx_mgr = contextlib .nullcontext
506527 with ctx_mgr ():
507- # Cast the incoming version strings as LooseVersion instances to sort using
508- # the LooseVersion.__cmp__ method.
509- sort_versions = [LooseVersion (version ) for version in versions ]
528+ # Cast the incoming version strings to sort them
529+ try :
530+ sort_versions = [self .version_parse (v ) for v in versions ]
531+ except Exception as e :
532+ sort_versions = [get_clean_version_string (v ) for v in versions ]
533+
510534 sort_versions .sort (reverse = True )
511535
512- # Convert the LooseVersions back to strings on return.
513- return [str (version ) for version in sort_versions ]
536+ # Convert the parsed versions back to strings on return.
537+ return [str (v ) for v in sort_versions ]
0 commit comments