Wed, 16 Mar 2022 18:57:58 +0100
Virtual Environment Management: added code to autodetect the Python interpreter at several places.
--- 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): """