SLIDER-630 python path specified via slider-client.xml or app config global prop
diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
index 99c4746..a676fcc 100644
--- a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
+++ b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
@@ -68,6 +68,7 @@
 import org.apache.slider.common.Constants;
 import org.apache.slider.common.SliderExitCodes;
 import org.apache.slider.common.SliderKeys;
+import org.apache.slider.common.SliderXmlConfKeys;
 import org.apache.slider.common.params.AbstractActionArgs;
 import org.apache.slider.common.params.AbstractClusterBuildingActionArgs;
 import org.apache.slider.common.params.ActionDiagnosticArgs;
@@ -905,6 +906,8 @@
       appConf.set(AgentKeys.PACKAGE_PATH, buildInfo.packageURI);
     }
 
+    propagatePythonExecutable(conf, instanceDefinition);
+
     // make any substitutions needed at this stage
     replaceTokens(appConf.getConfTree(), getUsername(), clustername);
 
@@ -1213,6 +1216,7 @@
 
     propagatePrincipals(config, instanceDefinition);
     // validate security data
+
 /*
     // turned off until tested
     SecurityConfiguration securityConfiguration =
@@ -1401,8 +1405,19 @@
     LaunchedApplication launchedApplication = amLauncher.submitApplication();
     return launchedApplication;
   }
-  
-  
+
+  private void propagatePythonExecutable(Configuration config,
+                                         AggregateConf instanceDefinition) {
+    String pythonExec = config.get(
+        SliderXmlConfKeys.PYTHON_EXECUTABLE_PATH);
+    if (pythonExec != null) {
+      instanceDefinition.getAppConfOperations().getGlobalOptions().putIfUnset(
+          SliderXmlConfKeys.PYTHON_EXECUTABLE_PATH,
+          pythonExec);
+    }
+  }
+
+
   /**
    * Wait for the launched app to be accepted in the time  
    * and, optionally running.
diff --git a/slider-core/src/main/java/org/apache/slider/common/SliderXmlConfKeys.java b/slider-core/src/main/java/org/apache/slider/common/SliderXmlConfKeys.java
index e7f8ce5..a967ebf 100644
--- a/slider-core/src/main/java/org/apache/slider/common/SliderXmlConfKeys.java
+++ b/slider-core/src/main/java/org/apache/slider/common/SliderXmlConfKeys.java
@@ -156,4 +156,9 @@
    */
   String KEY_SLIDER_AM_DEPENDENCY_CHECKS_DISABLED =
       "slider.am.dependency.checks.disabled";
+
+  /**
+   * The path to the python executable utilized to launch the agent.
+   */
+  String PYTHON_EXECUTABLE_PATH = "agent.python.exec.path";
 }
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
index c86eabd..4f981c7 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
@@ -402,7 +402,11 @@
     String label = getContainerLabel(container, role);
     CommandLineBuilder operation = new CommandLineBuilder();
 
-    operation.add(AgentKeys.PYTHON_EXE);
+    String pythonExec = instanceDefinition.getAppConfOperations()
+        .getGlobalOptions().getOption(SliderXmlConfKeys.PYTHON_EXECUTABLE_PATH,
+                                      AgentKeys.PYTHON_EXE);
+
+    operation.add(pythonExec);
 
     operation.add(scriptPath);
     operation.add(ARG_LABEL, label);