@Override
  public void uninstall(@NotNull List<PyPackage> packages) throws ExecutionException {
    List<String> args = new ArrayList<>();
    HelpersAwareTargetEnvironmentRequest helpersAwareRequest = getPythonTargetInterpreter();
    TargetEnvironmentRequest targetEnvironmentRequest = helpersAwareRequest.getTargetEnvironmentRequest();
    PythonScriptExecution pythonExecution =
      PythonScripts.prepareHelperScriptExecution(PythonHelper.PACKAGING_TOOL, helpersAwareRequest);
    try {
      pythonExecution.addParameter(UNINSTALL);
      // TODO [targets] Remove temporary usage of String arguments
      args.add(UNINSTALL);
      boolean canModify = true;
      for (PyPackage pkg : packages) {
        if (canModify) {
          final String location = pkg.getLocation();
          if (location != null) {
            // TODO [targets] Introspection is required here
            canModify = Files.isWritable(Paths.get(location));
          }
        }
        pythonExecution.addParameter(pkg.getName());
        // TODO [targets] Remove temporary usage of String arguments
        args.add(pkg.getName());
      }
      // TODO [targets] Pass `parentDir = null`
      getPythonProcessResult(pythonExecution, !canModify, true, targetEnvironmentRequest);
    }
    catch (PyExecutionException e) {
      throw new PyExecutionException(e.getMessage(), "pip", args, e.getStdout(), e.getStderr(), e.getExitCode(), e.getFixes());
    }
    finally {
      LOG.debug("Packages cache is about to be refreshed because these packages were uninstalled: " + packages);
      refreshPackagesSynchronously();
    }
  }
@Override
  public void uninstall(@NotNull List<PyPackage> packages)