#!/usr/bin/env python """ Run sasview in place. This allows sasview to use the python files in the source tree without having to call setup.py install first. A rebuild is still necessary when working on sans models or c modules. Usage: ./run.py [(module|script) args...] Without arguments run.py runs sasview. With arguments, run.py will run the given module or script. """ import os import sys import imp from glob import glob from contextlib import contextmanager from os.path import abspath, dirname, join as joinpath def addpath(path): """ Add a directory to the python path environment, and to the PYTHONPATH environment variable for subprocesses. """ path = abspath(path) if 'PYTHONPATH' in os.environ: PYTHONPATH = path + os.pathsep + os.environ['PYTHONPATH'] else: PYTHONPATH = path os.environ['PYTHONPATH'] = PYTHONPATH sys.path.insert(0, path) @contextmanager def cd(path): """ Change directory for duration of "with" context. """ old_dir = os.getcwd() os.chdir(path) yield os.chdir(old_dir) def import_package(modname, path): """Import a package into a particular point in the python namespace""" mod = imp.load_source(modname, abspath(joinpath(path,'__init__.py'))) sys.modules[modname] = mod mod.__path__ = [abspath(path)] return mod def import_dll(modname, build_path): """Import a DLL from the build directory""" import sysconfig ext = sysconfig.get_config_var('SO') # build_path comes from context path = joinpath(build_path, *modname.split('.'))+ext #print "importing", modname, "from", path return imp.load_dynamic(modname, path) def prepare(): # Don't create *.pyc files sys.dont_write_bytecode = True # Debug numpy warnings #import numpy; numpy.seterr(all='raise') # find the directories for the source and build from distutils.util import get_platform root = abspath(dirname(__file__)) platform = '%s-%s'%(get_platform(),sys.version[:3]) build_path = joinpath(root, 'build','lib.'+platform) # Make sure that we have a private version of mplconfig mplconfig = joinpath(abspath(dirname(__file__)), '.mplconfig') os.environ['MPLCONFIGDIR'] = mplconfig if not os.path.exists(mplconfig): os.mkdir(mplconfig) #import matplotlib #matplotlib.use('Agg') #print matplotlib.__file__ #import pylab; pylab.hold(False) # add periodictable to the path try: import periodictable except: addpath(joinpath(root, '..','periodictable')) try: import bumps except: addpath(joinpath(root, '..','bumps')) # select wx version #addpath(os.path.join(root, '..','wxPython-src-3.0.0.0','wxPython')) # Build project if the build directory does not already exist. if not os.path.exists(build_path): import subprocess with cd(root): subprocess.call((sys.executable, "setup.py", "build"), shell=False) # Put the source trees on the path addpath(joinpath(root, 'src')) addpath(joinpath(root, 'park-1.2.1')) # Import the sansview package from root/sansview as sans.sansview. It would # be better to just store the package in src/sans/sansview. import sans sans.sansview = import_package('sans.sansview', joinpath(root,'sansview')) # The sans.models package Compiled Model files should be pulled in from the build directory even though # the source is stored in src/sans/models. # Compiled modules need to be pulled from the build directory. # Some packages are not where they are needed, so load them explicitly. import sans.pr sans.pr.core = import_package('sans.pr.core', joinpath(build_path, 'sans', 'pr', 'core')) #import_dll('park._modeling', build_path) #park = import_package('park',os.path.join(build_path,'park')) # Pull the entire sans.models package from the build directory since it contains # a mixture of autogenerated python and C. Any changes in models will require # a rebuild with setup.py build sans.models = import_package('sans.models', joinpath(build_path, 'sans', 'models')) sys.path.append(build_path) #print "\n".join(sys.path) #from sans.models import SphereModel if __name__ == "__main__": prepare() from sans.sansview.sansview import run run()