Virtual Environment Management: added code to autodetect the Python interpreter at several places. eric7

Wed, 16 Mar 2022 18:57:58 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 16 Mar 2022 18:57:58 +0100
branch
eric7
changeset 8986
665d14b3c01a
parent 8985
30e9e592732d
child 8987
e9826bde657f

Virtual Environment Management: added code to autodetect the Python interpreter at several places.

eric7/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
eric7/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
eric7/Documentation/Source/eric7.VirtualEnv.VirtualenvAddEditDialog.html file | annotate | diff | comparison | revisions
eric7/VirtualEnv/VirtualenvAddEditDialog.py file | annotate | diff | comparison | revisions
eric7/VirtualEnv/VirtualenvInterpreterSelectionDialog.py file | annotate | diff | comparison | revisions
Binary file eric7/Documentation/Help/source.qch has changed
--- a/eric7/Documentation/Help/source.qhp	Tue Mar 15 19:52:29 2022 +0100
+++ b/eric7/Documentation/Help/source.qhp	Wed Mar 16 18:57:58 2022 +0100
@@ -17043,6 +17043,7 @@
       <keyword name="VirtualenvAddEditDialog" id="VirtualenvAddEditDialog" ref="eric7.VirtualEnv.VirtualenvAddEditDialog.html#VirtualenvAddEditDialog" />
       <keyword name="VirtualenvAddEditDialog (Constructor)" id="VirtualenvAddEditDialog (Constructor)" ref="eric7.VirtualEnv.VirtualenvAddEditDialog.html#VirtualenvAddEditDialog.__init__" />
       <keyword name="VirtualenvAddEditDialog (Module)" id="VirtualenvAddEditDialog (Module)" ref="eric7.VirtualEnv.VirtualenvAddEditDialog.html" />
+      <keyword name="VirtualenvAddEditDialog.__detectPythonInterpreter" id="VirtualenvAddEditDialog.__detectPythonInterpreter" ref="eric7.VirtualEnv.VirtualenvAddEditDialog.html#VirtualenvAddEditDialog.__detectPythonInterpreter" />
       <keyword name="VirtualenvAddEditDialog.__updateOk" id="VirtualenvAddEditDialog.__updateOk" ref="eric7.VirtualEnv.VirtualenvAddEditDialog.html#VirtualenvAddEditDialog.__updateOk" />
       <keyword name="VirtualenvAddEditDialog.getData" id="VirtualenvAddEditDialog.getData" ref="eric7.VirtualEnv.VirtualenvAddEditDialog.html#VirtualenvAddEditDialog.getData" />
       <keyword name="VirtualenvAddEditDialog.on_anacondaCheckBox_clicked" id="VirtualenvAddEditDialog.on_anacondaCheckBox_clicked" ref="eric7.VirtualEnv.VirtualenvAddEditDialog.html#VirtualenvAddEditDialog.on_anacondaCheckBox_clicked" />
--- a/eric7/Documentation/Source/eric7.VirtualEnv.VirtualenvAddEditDialog.html	Tue Mar 15 19:52:29 2022 +0100
+++ b/eric7/Documentation/Source/eric7.VirtualEnv.VirtualenvAddEditDialog.html	Wed Mar 16 18:57:58 2022 +0100
@@ -59,6 +59,10 @@
 <td>Constructor</td>
 </tr>
 <tr>
+<td><a href="#VirtualenvAddEditDialog.__detectPythonInterpreter">__detectPythonInterpreter</a></td>
+<td>Private method</td>
+</tr>
+<tr>
 <td><a href="#VirtualenvAddEditDialog.__updateOk">__updateOk</a></td>
 <td>Private slot to update the state of the OK button.</td>
 </tr>
@@ -148,6 +152,32 @@
 reference to the parent widget
 </dd>
 </dl>
+<a NAME="VirtualenvAddEditDialog.__detectPythonInterpreter" ID="VirtualenvAddEditDialog.__detectPythonInterpreter"></a>
+<h4>VirtualenvAddEditDialog.__detectPythonInterpreter</h4>
+<b>__detectPythonInterpreter</b>(<i>venvDirectory</i>)
+
+<p>
+        Private method 
+</p>
+<dl>
+
+<dt><i>venvDirectory</i> (str)</dt>
+<dd>
+directory for the virtual environment
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+detected Python interpreter or empty string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
 <a NAME="VirtualenvAddEditDialog.__updateOk" ID="VirtualenvAddEditDialog.__updateOk"></a>
 <h4>VirtualenvAddEditDialog.__updateOk</h4>
 <b>__updateOk</b>(<i></i>)
--- a/eric7/VirtualEnv/VirtualenvAddEditDialog.py	Tue Mar 15 19:52:29 2022 +0100
+++ b/eric7/VirtualEnv/VirtualenvAddEditDialog.py	Wed Mar 16 18:57:58 2022 +0100
@@ -20,7 +20,6 @@
 import Utilities
 
 
-# TODO: add code to autodetect a Python interpreter
 class VirtualenvAddEditDialog(QDialog, Ui_VirtualenvAddEditDialog):
     """
     Class implementing a dialog to enter the data of a virtual environment.
@@ -87,14 +86,19 @@
         )
         
         self.nameEdit.setText(venvName)
-        if venvName:
+        if venvDirectory:
             self.targetDirectoryPicker.setText(venvDirectory,
                                                toNative=not isRemote)
         else:
             self.targetDirectoryPicker.setText(self.__envBaseDir,
                                                toNative=not isRemote)
-        self.pythonExecPicker.setText(venvInterpreter,
-                                      toNative=not isRemote)
+        if not venvInterpreter and venvDirectory and not isRemote:
+            py = self.__detectPythonInterpreter(venvDirectory)
+            self.pythonExecPicker.setText(py)
+        else:
+            self.pythonExecPicker.setText(venvInterpreter,
+                                          toNative=not isRemote)
+        
         self.globalCheckBox.setChecked(isGlobal)
         self.anacondaCheckBox.setChecked(isConda)
         self.remoteCheckBox.setChecked(isRemote)
@@ -137,6 +141,32 @@
         self.buttonBox.button(
             QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
     
+    def __detectPythonInterpreter(self, venvDirectory):
+        """
+        Private method 
+        
+        @param venvDirectory directory for the virtual environment
+        @type str
+        @return detected Python interpreter or empty string
+        @rtype str
+        """
+        if venvDirectory:
+            # try to determine a Python interpreter name
+            if Utilities.isWindowsPlatform():
+                candidates = (
+                    os.path.join(venvDirectory, "Scripts", "python.exe"),
+                    os.path.join(venvDirectory, "python.exe"),
+                )
+            else:
+                candidates = (
+                    os.path.join(venvDirectory, "bin", "python3"),
+                )
+            for py in candidates:
+                if os.path.exists(py):
+                    return py
+        
+        return ""
+    
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
@@ -162,6 +192,9 @@
         else:
             self.pythonExecPicker.setDefaultDirectory(
                 sys.executable.replace("w.exe", ".exe"))
+        py = self.__detectPythonInterpreter(txt)
+        if py:
+            self.pythonExecPicker.setText(py)
     
     @pyqtSlot(str)
     def on_pythonExecPicker_textChanged(self, txt):
--- a/eric7/VirtualEnv/VirtualenvInterpreterSelectionDialog.py	Tue Mar 15 19:52:29 2022 +0100
+++ b/eric7/VirtualEnv/VirtualenvInterpreterSelectionDialog.py	Wed Mar 16 18:57:58 2022 +0100
@@ -19,8 +19,9 @@
     Ui_VirtualenvInterpreterSelectionDialog
 )
 
+import Globals
 
-# TODO: add code to autodetect a Python interpreter
+
 class VirtualenvInterpreterSelectionDialog(
         QDialog, Ui_VirtualenvInterpreterSelectionDialog):
     """
@@ -46,7 +47,26 @@
             self.tr("Python Interpreter"))
         
         self.nameEdit.setText(venvName)
-        self.pythonExecPicker.setText(venvDirectory)
+        
+        if venvDirectory:
+            # try to determine a Python interpreter name
+            if Globals.isWindowsPlatform():
+                candidates = (
+                    os.path.join(venvDirectory, "Scripts", "python.exe"),
+                    os.path.join(venvDirectory, "python.exe"),
+                )
+            else:
+                candidates = (
+                    os.path.join(venvDirectory, "bin", "python3"),
+                )
+            for py in candidates:
+                if os.path.exists(py):
+                    self.pythonExecPicker.setText(py)
+                    break
+            else:
+                self.pythonExecPicker.setText(venvDirectory)
+        else:
+            self.pythonExecPicker.setText(venvDirectory)
     
     def __updateOK(self):
         """

eric ide

mercurial