Changeset 11695:efdd815552d0 in orange


Ignore:
Timestamp:
09/11/13 13:29:11 (7 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Use 'easy_install' to install add-ons.

Location:
Orange
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngDlgs.py

    r11654 r11695  
    854854        self.busy(True) 
    855855        self.repaint() 
     856 
     857        addons = Orange.utils.addons.open_addons(flag="r") 
     858 
    856859        add, remove, upgrade = self.to_install(), self.to_remove(), self.to_upgrade 
    857860 
     
    872875            return box.exec_() 
    873876 
     877        def subprocesswait(process): 
     878            output = [] 
     879            while process.poll() is None: 
     880                try: 
     881                    line = process.stdout.readline() 
     882                except IOError as ex: 
     883                    if ex.errno != 4: 
     884                        raise 
     885                else: 
     886                    output.append(line) 
     887                    qApp.processEvents(QEventLoop.ExcludeUserInputEvents) 
     888                    print line, 
     889 
     890            if process.returncode: 
     891                output = "".join(output) 
     892                output += process.stdout.read() 
     893 
     894                errormessage("Error", 
     895                             "'easy_install' exited with error code %i" % 
     896                             process.returncode, 
     897                             details=output) 
     898            return process.returncode 
     899 
     900        def easy_install(req): 
     901            try: 
     902                process = Orange.utils.addons.easy_install_process([req]) 
     903            except (OSError, IOError): 
     904                # TODO: Should show some usefull message (executable not 
     905                # found, permission error, ... 
     906                raise 
     907            else: 
     908                subprocesswait(process) 
     909 
    874910        for name in upgrade: 
     911            req = "{0}=={1}".format( 
     912                name, addons[name.lower()].available_version) 
     913 
     914            self.busy("Upgrading %s ..." % name) 
     915            self.progress.setRange(0, 0) 
     916            self.repaint() 
     917 
     918            easy_install(req) 
     919 
     920        for name in remove: 
     921            self.busy("Uninstalling %s ..." % name) 
     922            self.repaint() 
    875923            try: 
    876                 self.busy("Upgrading %s ..." % name) 
    877                 self.repaint() 
    878                 Orange.utils.addons.upgrade(name, self.pcb) 
    879             except subprocess.CalledProcessError, ex: 
    880                 errormessage("Error", 
    881                              "setup.py script exited with error code %i" \ 
    882                              % ex.returncode, 
    883                              details=ex.output) 
    884             except Exception, e: 
    885                 errormessage("Error", 
    886                              "Problem upgrading add-on %s: %s" % (name, e), 
    887                              exc_info=True) 
    888  
    889         for name in remove: 
    890             try: 
    891                 self.busy("Uninstalling %s ..." % name) 
    892                 self.repaint() 
    893924                Orange.utils.addons.uninstall(name, self.pcb) 
    894925            except Exception, e: 
     
    898929 
    899930        for name in add: 
    900             try: 
    901                 self.busy("Installing %s ..." % name) 
    902                 self.repaint() 
    903                 Orange.utils.addons.install(name, self.pcb) 
    904             except subprocess.CalledProcessError, ex: 
    905                 errormessage("Error", 
    906                              "setup.py script exited with error code %i" \ 
    907                              % ex.returncode, 
    908                              details=ex.output) 
    909  
    910             except Exception, e: 
    911                 errormessage("Error", 
    912                              "Problem installing add-on %s: %s" % (name, e), 
    913                              exc_info=True) 
    914  
    915         if len(upgrade) > 0: 
    916             QMessageBox.warning(self, "Restart Orange", "After upgrading add-ons, it is very important to restart Orange to make sure the changes have been applied.") 
    917         elif len(remove) > 0:  # Don't bother with this if there has already been one (more important) warning. 
    918             QMessageBox.warning(self, "Restart Orange", "After removal of add-ons, it is suggested that you restart Orange for the changes to become effective.") 
     931            req = "{0}=={1}".format( 
     932                name, addons[name.lower()].available_version) 
     933 
     934            self.busy("Installing %s ..." % name) 
     935            self.progress.setRange(0, 0) 
     936            self.repaint() 
     937 
     938            easy_install(req) 
     939 
     940        if len(add) + len(upgrade) + len(remove) > 0: 
     941            QMessageBox.information( 
     942                self, "Restart Orange", 
     943                "Please restart Orange for changes to take effect.") 
    919944 
    920945        QDialog.accept(self) 
  • Orange/utils/addons.py

    r11694 r11695  
    3636import site 
    3737import itertools 
     38import pipes 
    3839 
    3940from collections import namedtuple, defaultdict 
     
    430431        func() 
    431432 
     433 
     434def easy_install_process(args, bufsize=-1): 
     435    from setuptools.command import easy_install 
     436    # Check if easy_install supports '--user' switch 
     437    if "user" in [opt[0] for opt in easy_install.easy_install.user_options]: 
     438        has_user_site = True 
     439    else: 
     440        has_user_site = False 
     441 
     442    if has_user_site and site.USER_SITE in sys.path: 
     443        args = ["--user"] + args 
     444 
     445    # properly quote arguments if necessary 
     446    args = map(pipes.quote, args) 
     447 
     448    script = """ 
     449import sys 
     450from setuptools.command.easy_install import main 
     451sys.exit(main({args!r})) 
     452""" 
     453    script = script.format(args=args) 
     454 
     455    return python_process(["-c", script], bufsize=bufsize) 
     456 
     457 
     458def python_process(args, script_name=None, cwd=None, env=None, **kwargs): 
     459    """ 
     460    Run a `sys.executable` in a subprocess with `args`. 
     461    """ 
     462    executable = sys.executable 
     463    if os.name == "nt" and os.path.basename(executable) == "pythonw.exe": 
     464        dirname, _ = os.path.split(executable) 
     465        executable = os.path.join(dirname, "python.exe") 
     466        # by default a new console window would show up when executing the 
     467        # script 
     468        startupinfo = subprocess.STARTUPINFO() 
     469        if hasattr(subprocess, "STARTF_USESHOWWINDOW"): 
     470            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
     471        else: 
     472            # This flag was missing in inital releases of 2.7 
     473            startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW 
     474 
     475        kwargs["startupinfo"] = startupinfo 
     476 
     477    if script_name is not None: 
     478        script = script_name 
     479    else: 
     480        script = executable 
     481 
     482    process = subprocess.Popen( 
     483        [script] + args, 
     484        executable=executable, 
     485        cwd=cwd, 
     486        env=env, 
     487        stderr=subprocess.STDOUT, 
     488        stdout=subprocess.PIPE, 
     489        **kwargs 
     490    ) 
     491 
     492    return process 
     493 
     494 
    432495def uninstall(name, progress_callback=None): 
    433496    try: 
Note: See TracChangeset for help on using the changeset viewer.