diff --git a/trains/backend_interface/task/repo/freeze.py b/trains/backend_interface/task/repo/freeze.py index 77123f40..8961bf06 100644 --- a/trains/backend_interface/task/repo/freeze.py +++ b/trains/backend_interface/task/repo/freeze.py @@ -4,8 +4,30 @@ from .util import get_command_output def pip_freeze(): + req_lines = [] + local_packages = [] try: - return get_command_output([sys.executable, "-m", "pip", "freeze"]).splitlines() + req_lines = get_command_output([sys.executable, "-m", "pip", "freeze"]).splitlines() + # fix "package @ file://" from pip freeze to "package" + for i, r in enumerate(req_lines): + parts = r.split('@', 1) + if parts and len(parts) == 2 and parts[1].strip().lower().startswith('file://'): + req_lines[i] = parts[0] + local_packages.append((i, parts[0].strip())) + # if we found local packages, at least get their versions (using pip list) + if local_packages: + # noinspection PyBroadException + try: + list_lines = get_command_output( + [sys.executable, "-m", "pip", "list", "--format", "freeze"]).splitlines() + for index, name in local_packages: + line = [r for r in list_lines if r.strip().startswith(name+'==')] + if not line: + continue + line = line[0] + req_lines[index] = line.strip() + except Exception: + pass except Exception as ex: print('Failed calling "pip freeze": {}'.format(str(ex))) - return [] + return req_lines diff --git a/trains/backend_interface/task/task.py b/trains/backend_interface/task/task.py index 92c1f979..ee1cef5c 100644 --- a/trains/backend_interface/task/task.py +++ b/trains/backend_interface/task/task.py @@ -48,7 +48,7 @@ from ...debugging.log import LoggerRoot from ...storage.helper import StorageHelper, StorageError from .access import AccessMixin from .log import TaskHandler -from .repo import ScriptInfo +from .repo import ScriptInfo, pip_freeze from .repo.util import get_command_output from ...config import config, PROC_MASTER_ID_ENV_VAR, SUPPRESS_UPDATE_MESSAGE_ENV_VAR @@ -312,7 +312,7 @@ class Task(IdObjectBase, AccessMixin, SetupUploadMixin): if config.get('development.detect_with_pip_freeze', False): conda_requirements = "" requirements = '# Python ' + sys.version.replace('\n', ' ').replace('\r', ' ') + '\n\n'\ - + get_command_output([sys.executable, "-m", "pip", "freeze"]) + + "\n".join(pip_freeze()) else: requirements, conda_requirements = script_requirements.get_requirements( entry_point_filename=entry_point_filename)