Changeset 11094:67f486d63faf in orange


Ignore:
Timestamp:
02/11/13 17:53:32 (15 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Running setup.py script in a subprocess.

If the package uses 'distribute_setup' module the installation fails when
the currently installed (and already imported) version is older then the
requested version.

Location:
Orange
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngDlgs.py

    r11075 r11094  
    33#    signal dialog, canvas options dialog 
    44 
     5import sys 
     6import os 
     7import subprocess 
     8from contextlib import closing 
     9 
    510from PyQt4.QtCore import * 
    611from PyQt4.QtGui import * 
    712from orngCanvasItems import MyCanvasText 
    8 from contextlib import closing 
    9 import OWGUI, sys, os 
     13 
     14import OWGUI 
    1015 
    1116has_pip = True 
     
    725730        self.memo.setMinimumHeight(min(300, documentSize.height() + 2 * self.memo.frameWidth())) 
    726731 
     732 
    727733class AddOnManagerDialog(QDialog): 
    728734    def __init__(self, canvasDlg, *args): 
     
    870876                self.repaint() 
    871877                Orange.utils.addons.upgrade(name, self.pcb) 
     878            except subprocess.CalledProcessError, ex: 
     879                errormessage("Error", 
     880                             "setup.py script exited with error code %i" \ 
     881                             % ex.returncode, 
     882                             details=ex.output) 
    872883            except Exception, e: 
    873884                errormessage("Error", 
    874885                             "Problem upgrading add-on %s: %s" % (name, e), 
    875886                             exc_info=True) 
    876             except SystemExit, e: 
    877                 errormessage("Error", "Abnormal exit", exc_info=True) 
    878887 
    879888        for name in remove: 
     
    892901                self.repaint() 
    893902                Orange.utils.addons.install(name, self.pcb) 
     903            except subprocess.CalledProcessError, ex: 
     904                errormessage("Error", 
     905                             "setup.py script exited with error code %i" \ 
     906                             % ex.returncode, 
     907                             details=ex.output) 
     908 
    894909            except Exception, e: 
    895910                errormessage("Error", 
    896911                             "Problem installing add-on %s: %s" % (name, e), 
    897912                             exc_info=True) 
    898             except SystemExit, e: 
    899                 errormessage("Error", "Abnormal exit", exc_info=True) 
    900913 
    901914        if len(upgrade) > 0: 
  • Orange/utils/addons.py

    r11071 r11094  
    3030import sys 
    3131import platform 
     32import subprocess 
     33 
    3234from collections import namedtuple, defaultdict 
    3335from contextlib import closing 
     
    177179    rebuild_index() 
    178180 
     181 
    179182def run_setup(setup_script, args): 
    180     old_dir = os.getcwd() 
    181     save_argv = sys.argv[:] 
    182     save_path = sys.path[:] 
    183     setup_dir = os.path.abspath(os.path.dirname(setup_script)) 
    184     temp_dir = os.path.join(setup_dir,'temp') 
    185     if not os.path.isdir(temp_dir): os.makedirs(temp_dir) 
    186     save_tmp = tempfile.tempdir 
    187     save_modules = sys.modules.copy() 
    188     try: 
    189         tempfile.tempdir = temp_dir 
    190         os.chdir(setup_dir) 
    191         try: 
    192             sys.argv[:] = [setup_script]+list(args) 
    193             sys.path.insert(0, setup_dir) 
    194             execfile( 
    195                     "setup.py", 
    196                     {'__file__':setup_script, '__name__':'__main__'} 
    197                 ) 
    198         except SystemExit, v: 
    199             if v.args and v.args[0]: 
    200                 raise 
    201                 # Normal exit, just return 
    202     finally: 
    203         sys.modules.update(save_modules) 
    204         for key in list(sys.modules): 
    205             if key not in save_modules: del sys.modules[key] 
    206         os.chdir(old_dir) 
    207         sys.path[:] = save_path 
    208         sys.argv[:] = save_argv 
    209         tempfile.tempdir = save_tmp 
     183    """ 
     184    Run `setup_script` with `args` in a subprocess, using 
     185    :ref:`subprocess.check_output`. 
     186 
     187    """ 
     188    source_root = os.path.dirname(setup_script) 
     189    executable = sys.executable 
     190    extra_kwargs = {} 
     191    if os.name == "nt" and os.path.basename(executable) == "pythonw.exe": 
     192        dirname, _ = os.path.split(executable) 
     193        executable = os.path.join(dirname, "python.exe") 
     194        # by default a new console window would show up when executing the 
     195        # script 
     196        startupinfo = subprocess.STARTUPINFO() 
     197        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
     198        extra_kwargs["startupinfo"] = startupinfo 
     199 
     200    subprocess.check_output([executable, setup_script] + args, 
     201                             cwd=source_root, 
     202                             stderr=subprocess.STDOUT, 
     203                             **extra_kwargs) 
    210204 
    211205 
     
    235229            raise Exception("Unable to install add-on - it is not properly packed.") 
    236230 
    237         try: 
    238             switches = [] 
    239             if site.USER_SITE in sys.path:   # we're not in a virtualenv 
    240                 switches.append('--user') 
    241             run_setup(setup_py, ['install'] + switches) 
    242         except Exception, e: 
    243             raise Exception("Unable to install add-on: %s" % e) 
     231        switches = [] 
     232        if site.USER_SITE in sys.path:   # we're not in a virtualenv 
     233            switches.append('--user') 
     234        run_setup(setup_py, ['install'] + switches) 
    244235    finally: 
    245236        shutil.rmtree(tmpdir, ignore_errors=True) 
Note: See TracChangeset for help on using the changeset viewer.