def _create_private_venv(self, path, description, clear=False, upgrade=False): if not _check_venv_installed(self): return # Don't include system site packages # This way all students will have similar configuration # independently of system Python (if Thonny is used with system Python) # NB! Cant run venv.create directly, because in Windows bundle # it tries to link venv to thonny.exe. # Need to run it via proper python args = ["-m", "venv"] if clear: args.append("--clear") if upgrade: args.append("--upgrade") try: import ensurepip except ImportError: args.append("--without-pip") args.append(path) proc = create_frontend_python_process(args) from thonny.workdlg import SubprocessDialog dlg = SubprocessDialog( get_workbench(), proc, "Preparing the backend", long_description=description, autostart=True, ) try: ui_utils.show_dialog(dlg) except Exception: # if using --without-pip the dialog may close very quickly # and for some reason wait_window would give error then logging.exception("Problem with waiting for venv creation dialog") get_workbench().become_active_window( ) # Otherwise focus may get stuck somewhere bindir = os.path.dirname(get_private_venv_executable()) # create private env marker marker_path = os.path.join(bindir, "is_private") with open(marker_path, mode="w") as fp: fp.write("# This file marks Thonny-private venv") # Create recommended pip conf to get rid of list deprecation warning # https://github.com/pypa/pip/issues/4058 pip_conf = "pip.ini" if running_on_windows() else "pip.conf" with open(os.path.join(path, pip_conf), mode="w") as fp: fp.write("[list]\nformat = columns") assert os.path.isdir(path)
def _run_pip_with_dialog(self, args, title) -> Tuple[int, str, str]: args = ["-m", "thonny.plugins.micropython.minipip"] + args proc = running.create_frontend_python_process(args, stderr=subprocess.STDOUT) cmd = proc.cmd dlg = SubprocessDialog(self, proc, "minipip", long_description=title, autostart=True) ui_utils.show_dialog(dlg) return dlg.returncode, dlg.stdout, dlg.stderr
def _create_venv(self, event=None): if not _check_venv_installed(self): return messagebox.showinfo( "Creating new virtual environment", "After clicking 'OK' you need to choose an empty directory, " "which will be the root of your new virtual environment.", parent=self, ) path = None while True: path = askdirectory( parent=self.winfo_toplevel(), initialdir=path, title=tr("Select empty directory for new virtual environment"), ) if not path: return if os.listdir(path): messagebox.showerror( tr("Bad directory"), tr("Selected directory is not empty.\nSelect another or cancel." ), master=self, ) else: break assert os.path.isdir(path) path = normpath_with_actual_case(path) proc = subprocess.Popen( [running.get_interpreter_for_subprocess(), "-m", "venv", path], stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, ) from thonny.workdlg import SubprocessDialog dlg = SubprocessDialog(self, proc, tr("Creating virtual environment"), autostart=True) ui_utils.show_dialog(dlg) if running_on_windows(): exe_path = normpath_with_actual_case( os.path.join(path, "Scripts", "python.exe")) else: exe_path = os.path.join(path, "bin", "python3") if os.path.exists(exe_path): self._configuration_variable.set(exe_path)