diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py index 9410f15197a..77597db63b9 100755 --- a/lib/galaxy/tools/__init__.py +++ b/lib/galaxy/tools/__init__.py @@ -375,6 +375,16 @@ class Tool( object, Dictifiable ): def valid_input_states( self ): return model.Dataset.valid_input_states + @property + def requires_galaxy_python_environment(self): + """Indicates this tool's runtime requires Galaxy's Python environment.""" + # All special tool types (data source, history import/export, etc...) + # seem to require Galaxy's Python. + return self.tool_type != "default" or self.id in [ + "__SET_METADATA__", + "upload1", + ] + def __get_job_tool_configuration(self, job_params=None): """Generalized method for getting this tool's job configuration. @@ -1288,6 +1298,7 @@ class Tool( object, Dictifiable ): installed_tool_dependencies=self.installed_tool_dependencies, tool_dir=self.tool_dir, job_directory=job_directory, + preserve_python_environment=self.requires_galaxy_python_environment, metadata=metadata, ) diff --git a/lib/galaxy/tools/deps/resolvers/conda.py b/lib/galaxy/tools/deps/resolvers/conda.py index 13477f77100..5a3eabaef22 100644 --- a/lib/galaxy/tools/deps/resolvers/conda.py +++ b/lib/galaxy/tools/deps/resolvers/conda.py @@ -164,6 +164,8 @@ class CondaDependencyResolver(DependencyResolver, ListableDependencyResolver, In log.warning("Conda dependency resolver not sent job directory.") return NullDependency(version=version, name=name) + preserve_python_environment = kwds.get("preserve_python_environment", False) + if not is_installed and self.auto_install: is_installed = self.install_dependency(name=name, version=version, type=type) @@ -190,7 +192,8 @@ class CondaDependencyResolver(DependencyResolver, ListableDependencyResolver, In conda_environment, exact, name, - version + version, + preserve_python_environment, ) else: if len(conda_environment) > 79: @@ -247,12 +250,13 @@ class CondaDependency(Dependency): dict_collection_visible_keys = Dependency.dict_collection_visible_keys + ['environment_path', 'name', 'version'] dependency_type = 'conda' - def __init__(self, activate, environment_path, exact, name=None, version=None): + def __init__(self, activate, environment_path, exact, name=None, version=None, preserve_python_environment=False): self.activate = activate self.environment_path = environment_path self._exact = exact self._name = name self._version = version + self._preserve_python_environment = preserve_python_environment @property def exact(self): @@ -267,11 +271,19 @@ class CondaDependency(Dependency): return self._version def shell_commands(self, requirement): - return """[ "$CONDA_DEFAULT_ENV" = "%s" ] || . %s '%s' 2>&1 """ % ( - self.environment_path, - self.activate, - self.environment_path - ) + if self._preserve_python_environment: + # On explicit testing the only such requirement I am aware of is samtools - and it seems to work + # fine with just appending the PATH as done below. Other tools may require additional + # variables in the future. + return """export PATH=$PATH:'%s/bin' """ % ( + self.environment_path, + ) + else: + return """[ "$CONDA_DEFAULT_ENV" = "%s" ] || . %s '%s' 2>&1 """ % ( + self.environment_path, + self.activate, + self.environment_path + ) def _string_as_bool( value ):