Changeset 11094:67f486d63faf in orange for Orange/utils/addons.py


Ignore:
Timestamp:
02/11/13 17:53:32 (14 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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.