Pass virtualenv variables to the python process (PY-15085)
authorDmitry Trofimov <dmitry.trofimov@jetbrains.com>
Fri, 2 Sep 2016 10:50:17 +0000 (12:50 +0200)
committerDmitry Trofimov <dmitry.trofimov@jetbrains.com>
Fri, 2 Sep 2016 10:50:17 +0000 (12:50 +0200)
python/python-terminal/src/com/jetbrains/python/sdk/PyVirtualEnvTerminalCustomizer.kt
python/src/com/jetbrains/python/run/PyVirtualEnvReader.kt [new file with mode: 0644]
python/src/com/jetbrains/python/run/PythonCommandLineState.java
python/src/com/jetbrains/python/sdk/PythonSdkType.java

index 491a5c99241d41e4a3f00a6b253be5d824e4d640..82cb5cfbaf1443a002c6c33a4b148029a87be124 100644 (file)
@@ -19,9 +19,8 @@ import com.intellij.openapi.module.ModuleManager
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.projectRoots.Sdk
 import com.intellij.openapi.util.SystemInfo
-import com.intellij.util.EnvironmentUtil
-import com.jetbrains.python.sdk.flavors.PythonSdkFlavor
-import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor
+import com.jetbrains.python.run.PyVirtualEnvReader
+import com.jetbrains.python.run.findActivateScript
 import org.jetbrains.plugins.terminal.LocalTerminalCustomizer
 import java.io.File
 
@@ -81,21 +80,3 @@ class PyVirtualEnvTerminalCustomizer : LocalTerminalCustomizer() {
   }
 }
 
-class PyVirtualEnvReader(virtualEnvSdkPath: String) : EnvironmentUtil.ShellEnvReader() {
-  val activate = findActivateScript(virtualEnvSdkPath, shell)
-
-  override fun getShellProcessCommand(): MutableList<String>? {
-
-    return if (activate != null) mutableListOf(shell, "--rcfile", activate, "-i")
-    else super.getShellProcessCommand()
-  }
-
-}
-
-private fun findActivateScript(path: String?, shellPath: String): String? {
-  val shellName = File(shellPath).name
-  val activate = if (shellName == "fish" || shellName == "csh") File(File(path).parentFile, "activate." + shellName)
-  else File(File(path).parentFile, "activate")
-
-  return if (activate.exists()) activate.absolutePath else null
-}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/run/PyVirtualEnvReader.kt b/python/src/com/jetbrains/python/run/PyVirtualEnvReader.kt
new file mode 100644 (file)
index 0000000..8262783
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2000-2016 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.run
+
+import com.intellij.util.EnvironmentUtil
+import java.io.File
+
+/**
+ * @author traff
+ */
+
+
+class PyVirtualEnvReader(virtualEnvSdkPath: String) : EnvironmentUtil.ShellEnvReader() {
+  val activate = findActivateScript(virtualEnvSdkPath, shell)
+
+  override fun getShellProcessCommand(): MutableList<String>? {
+
+    return if (activate != null) mutableListOf(shell, "--rcfile", activate, "-i")
+    else super.getShellProcessCommand()
+  }
+
+}
+
+fun findActivateScript(path: String?, shellPath: String): String? {
+  val shellName = File(shellPath).name
+  val activate = if (shellName == "fish" || shellName == "csh") File(File(path).parentFile, "activate." + shellName)
+  else File(File(path).parentFile, "activate")
+
+  return if (activate.exists()) activate.absolutePath else null
+}
\ No newline at end of file
index 8cf84fb2e94254870cc905cb488b0fec35e63352..fdc8a93c37737c5242396384a59fe87d6c646018 100644 (file)
@@ -35,6 +35,7 @@ import com.intellij.execution.ui.ConsoleView;
 import com.intellij.facet.Facet;
 import com.intellij.facet.FacetManager;
 import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
 import com.intellij.openapi.module.ModuleUtilCore;
@@ -75,9 +76,10 @@ import java.nio.charset.Charset;
 import java.util.*;
 
 /**
- * @author Leonid Shalupov
+ * @author traff, Leonid Shalupov
  */
 public abstract class PythonCommandLineState extends CommandLineState {
+  private static final Logger LOG = Logger.getInstance("#com.jetbrains.python.run.PythonCommandLineState");
 
   // command line has a number of fixed groups of parameters; patchers should only operate on them and not the raw list.
 
@@ -291,13 +293,30 @@ public abstract class PythonCommandLineState extends CommandLineState {
 
     addCommonEnvironmentVariables(getInterpreterPath(project, myConfig), env);
 
+    setupVirtualEnvVariables(env, myConfig.getSdkHome());
+
     commandLine.getEnvironment().clear();
     commandLine.getEnvironment().putAll(env);
     commandLine.withParentEnvironmentType(myConfig.isPassParentEnvs() ? ParentEnvironmentType.CONSOLE : ParentEnvironmentType.NONE);
 
+
     buildPythonPath(project, commandLine, myConfig, isDebug);
   }
 
+  private static void setupVirtualEnvVariables(Map<String, String> env, String sdkHome) {
+    if (PythonSdkType.isVirtualEnv(sdkHome)) {
+      PyVirtualEnvReader reader = new PyVirtualEnvReader(sdkHome);
+      if (reader.getActivate() != null) {
+        try {
+          env.putAll(reader.readShellEnv());
+        }
+        catch (Exception e) {
+          LOG.error("Couldn't read virtualenv variables", e);
+        }
+      }
+    }
+  }
+
   protected static void addCommonEnvironmentVariables(@Nullable String homePath, Map<String, String> env) {
     PythonEnvUtil.setPythonUnbuffered(env);
     if (homePath != null) {
index f4c026c3f6a9c320873723b6dfa46ac5c8b32a12..6e72a55782c88021f7e0788b12047b7478216f72 100644 (file)
@@ -303,8 +303,12 @@ public final class PythonSdkType extends SdkType {
       });
   }
 
-  public static boolean isVirtualEnv(Sdk sdk) {
+  public static boolean isVirtualEnv(@NotNull Sdk sdk) {
     final String path = sdk.getHomePath();
+    return isVirtualEnv(path);
+  }
+
+  public static boolean isVirtualEnv(String path) {
     return path != null && getVirtualEnvRoot(path) != null;
   }