source: sasview/run.py @ 1606b35

magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 1606b35 was 1606b35, checked in by Paul Kienzle <pkienzle@…>, 6 years ago

Revert "use tinycc compiler from run.py on windows"

This reverts commit 3b0632fb72bf254fff73cf318c1fd17b7a911049.

  • Property mode set to 100755
File size: 6.0 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3"""
4Run sasview in place.  This allows sasview to use the python
5files in the source tree without having to call setup.py install
6first.  A rebuild is still necessary when working on sas models
7or c modules.
8
9Usage:
10
11./run.py [(module|script) args...]
12
13Without arguments run.py runs sasview.  With arguments, run.py will run
14the given module or script.
15"""
16from __future__ import print_function
17
18import imp
19import os
20import sys
21from contextlib import contextmanager
22from os.path import join as joinpath
23from os.path import abspath, dirname
24
25def addpath(path):
26    """
27    Add a directory to the python path environment, and to the PYTHONPATH
28    environment variable for subprocesses.
29    """
30    path = abspath(path)
31    if 'PYTHONPATH' in os.environ:
32        PYTHONPATH = path + os.pathsep + os.environ['PYTHONPATH']
33    else:
34        PYTHONPATH = path
35    os.environ['PYTHONPATH'] = PYTHONPATH
36    sys.path.insert(0, path)
37
38
39@contextmanager
40def cd(path):
41    """
42    Change directory for duration of "with" context.
43    """
44    old_dir = os.getcwd()
45    os.chdir(path)
46    yield
47    os.chdir(old_dir)
48
49
50def import_package(modname, path):
51    """Import a package into a particular point in the python namespace"""
52    #logger.debug("Dynamicly importing: %s", path)
53    mod = imp.load_source(modname, abspath(joinpath(path, '__init__.py')))
54    sys.modules[modname] = mod
55    mod.__path__ = [abspath(path)]
56    return mod
57
58
59def import_dll(modname, build_path):
60    """Import a DLL from the build directory"""
61    import sysconfig
62    ext = sysconfig.get_config_var('SO')
63    # build_path comes from context
64    path = joinpath(build_path, *modname.split('.')) + ext
65    # print "importing", modname, "from", path
66    return imp.load_dynamic(modname, path)
67
68
69def prepare():
70    # Don't create *.pyc files
71    sys.dont_write_bytecode = True
72
73    # Debug numpy warnings
74    #import numpy; numpy.seterr(all='raise')
75
76    # find the directories for the source and build
77    from distutils.util import get_platform
78    root = abspath(dirname(__file__))
79    platform = '%s-%s' % (get_platform(), sys.version[:3])
80    build_path = joinpath(root, 'build', 'lib.' + platform)
81
82    # Notify the help menu that the Sphinx documentation is in a different
83    # place than it otherwise would be.
84    os.environ['SASVIEW_DOC_PATH'] = joinpath(build_path, "doc")
85
86    # Make sure that we have a private version of mplconfig
87    #mplconfig = joinpath(abspath(dirname(__file__)), '.mplconfig')
88    #os.environ['MPLCONFIGDIR'] = mplconfig
89    #if not os.path.exists(mplconfig): os.mkdir(mplconfig)
90    #import matplotlib
91    # matplotlib.use('Agg')
92    # print matplotlib.__file__
93    #import pylab; pylab.hold(False)
94    # add periodictable to the path
95    try:
96        import periodictable
97    except:
98        addpath(joinpath(root, '..', 'periodictable'))
99
100    try:
101        import bumps
102    except:
103        addpath(joinpath(root, '..', 'bumps'))
104
105    try:
106        import tinycc
107    except:
108        addpath(joinpath(root, '../tinycc/build/lib'))
109
110    # select wx version
111    #addpath(os.path.join(root, '..','wxPython-src-3.0.0.0','wxPython'))
112
113    # Build project if the build directory does not already exist.
114    # PAK: with "update" we can always build since it is fast
115    if True or not os.path.exists(build_path):
116        import subprocess
117        with cd(root):
118            subprocess.call((sys.executable, "setup.py", "build", "update"), shell=False)
119
120    # Put the source trees on the path
121    addpath(joinpath(root, 'src'))
122
123    # sasmodels on the path
124    addpath(joinpath(root, '../sasmodels/'))
125
126    # The sas.models package Compiled Model files should be pulled in from the build directory even though
127    # the source is stored in src/sas/models.
128
129    # Compiled modules need to be pulled from the build directory.
130    # Some packages are not where they are needed, so load them explicitly.
131    import sas.sascalc.pr
132    sas.sascalc.pr.core = import_package('sas.sascalc.pr.core',
133                                         joinpath(build_path, 'sas', 'sascalc', 'pr', 'core'))
134
135    # Compiled modules need to be pulled from the build directory.
136    # Some packages are not where they are needed, so load them explicitly.
137    import sas.sascalc.file_converter
138    sas.sascalc.file_converter.core = import_package('sas.sascalc.file_converter.core',
139                                                     joinpath(build_path, 'sas', 'sascalc', 'file_converter', 'core'))
140
141    import sas.sascalc.calculator
142    sas.sascalc.calculator.core = import_package('sas.sascalc.calculator.core',
143                                                 joinpath(build_path, 'sas', 'sascalc', 'calculator', 'core'))
144
145    sys.path.append(build_path)
146
147    set_git_tag()
148    # print "\n".join(sys.path)
149
150def set_git_tag():
151    try:
152        import subprocess
153        import os
154        import platform
155        FNULL = open(os.devnull, 'w')
156        if platform.system() == "Windows":
157            args = ['git', 'describe', '--tags']
158        else:
159            args = ['git describe --tags']
160        git_revision = subprocess.check_output(args, stderr=FNULL, shell=True)
161        import sas.sasview
162        sas.sasview.__build__ = str(git_revision).strip()
163    except subprocess.CalledProcessError as cpe:
164        get_logger().warning("Error while determining build number\n  Using command:\n %s \n Output:\n %s"% (cpe.cmd,cpe.output))
165
166_logger = None
167def get_logger():
168    global _logger
169    if _logger is None:
170        from sas.logger_config import SetupLogger
171        _logger = SetupLogger(__name__).config_development()
172    return _logger
173
174if __name__ == "__main__":
175    # Need to add absolute path before actual prepare call,
176    # so logging can be done during initialization process too
177    root = abspath(dirname(__file__))
178    addpath(joinpath(root, 'src'))
179
180    get_logger().debug("Starting SASVIEW in debug mode.")
181    prepare()
182    from sas.sasview.sasview import run_cli, run_gui
183    if len(sys.argv) == 1:
184        run_gui()
185    else:
186        run_cli()
187    get_logger().debug("Ending SASVIEW in debug mode.")
Note: See TracBrowser for help on using the repository browser.