Index: rtemstoolkit/configuration.py
===================================================================
--- rtemstoolkit/configuration.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ rtemstoolkit/configuration.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -38,9 +38,4 @@
 import re
 
-try:
-    import configparser
-except:
-    import ConfigParser as configparser
-
 from rtemstoolkit import error
 from rtemstoolkit import path
@@ -48,6 +43,13 @@
 class configuration:
 
-    def __init__(self):
-        self.config = configparser.ConfigParser()
+    def __init__(self, raw = True):
+        self.raw = True
+        try:
+            import configparser
+            self.config = configparser.ConfigParser(strict = False)
+        except:
+            # python2
+            import ConfigParser as configparser
+            self.config = configparser.ConfigParser()
         self.ini = None
         self.macro_filter = re.compile('\$\{.+\}')
@@ -67,10 +69,13 @@
             s += [' [%s]' % (section)]
             for option in self.config.options(section):
-                s += ['  %s = %s' % (option, self.config.get(section, option))]
+                s += ['  %s = %s' % (option,
+                                     self.config.get(section,
+                                                     option,
+                                                     raw = self.raw))]
         return os.linesep.join(s)
 
     def get_item(self, section, label, err = True):
         try:
-            rec = self.config.get(section, label).replace(os.linesep, ' ')
+            rec = self.config.get(section, label, raw = self.raw).replace(os.linesep, ' ')
         except:
             if err:
@@ -90,5 +95,6 @@
             try:
                 ref = self.config.get(section_value[0],
-                                      section_value[1]).replace(os.linesep, ' ')
+                                      section_value[1],
+                                      raw = self.raw).replace(os.linesep, ' ')
                 rec = rec.replace(m, ref)
             except:
@@ -99,5 +105,5 @@
         try:
             items = []
-            for name, key in self.config.items(section):
+            for name, key in self.config.items(section, raw = self.raw):
                 if flatten:
                     items += [(name, key.replace(os.linesep, ' '))]
@@ -118,5 +124,5 @@
     def get_item_names(self, section, err = True):
         try:
-            return [item[0] for item in self.config.items(section)]
+            return [item[0] for item in self.config.items(section, raw = self.raw)]
         except:
             if err:
Index: rtemstoolkit/log.py
===================================================================
--- rtemstoolkit/log.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ rtemstoolkit/log.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -79,4 +79,6 @@
     if type(text) is list:
         text = os.linesep.join(text) + os.linesep
+    if isinstance(text, bytes):
+        text = text.decode('utf-8', 'ignore')
     if log:
         log.output(text)
@@ -176,4 +178,6 @@
         self._tail(text)
         out = os.linesep.join(text) + os.linesep
+        if isinstance(out, bytes):
+            out = out.decode('utf-8', 'ignore')
         self.lock.acquire()
         try:
Index: rtemstoolkit/python-wrapper.sh
===================================================================
--- rtemstoolkit/python-wrapper.sh	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
+++ rtemstoolkit/python-wrapper.sh	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -0,0 +1,54 @@
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2018 Chris Johns (chrisj@rtems.org)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+#
+# This script wraps python finding a suitable version to use.
+#
+set -e
+if test ! -f $PYTHON_CMD; then
+  echo "error: RTEMS Toolkit python command not found: $PYTHON_CMD"
+  exit 5
+fi
+for py in python3 python2 python
+do
+  set +e
+  py_cmd=$(command -v $py)
+  set -e
+  if test -n "$RTEMS_PYTHON_OVERRIDE"; then
+    if test "$RTEMS_PYTHON_OVERRIDE" != "$py"; then
+      py_cmd=""
+    fi
+  fi
+  if test -n "$py_cmd"; then
+    exec $py_cmd $PYTHON_CMD $0 $*
+  fi
+done
+echo "error: RTEMS Toolkit no valid python found"
+exit 5
Index: rtemstoolkit/rtems.py
===================================================================
--- rtemstoolkit/rtems.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ rtemstoolkit/rtems.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -63,13 +63,19 @@
             os.environ['PATH'] = os.pathsep.join(cspath[1:])
 
-def configuration_path():
+def configuration_path(prog = None):
     '''Return the path the configuration data path for RTEMS. The path is relative
     to the installed executable. Mangage the installed package and the in source
     tree when running from within the rtems-tools repo.
-
+    Note:
+     1. This code assumes the executable is wrapped and not using 'env'.
+     2. Ok to directly call os.path.
     '''
-    exec_name = os.path.abspath(sys.argv[0])
-    for top in [os.path.dirname(exec_name),
-                os.path.dirname(os.path.dirname(exec_name))]:
+    if prog is None:
+        exec_name = sys.argv[1]
+    else:
+        exec_name = prog
+    exec_name = os.path.abspath(exec_name)
+    for top in [os.path.dirname(os.path.dirname(exec_name)),
+                os.path.dirname(exec_name)]:
         config_path = path.join(top, 'share', 'rtems', 'config')
         if path.exists(config_path):
@@ -81,5 +87,5 @@
     return config_path
 
-def configuration_file(config):
+def configuration_file(config, prog = None):
     '''Return the path to a configuration file for RTEMS. The path is relative to
     the installed executable or we are testing and running from within the
@@ -87,7 +93,7 @@
 
     '''
-    return path.join(configuration_path(), config)
-
-def bsp_configuration_file():
+    return path.join(configuration_path(prog = prog), config)
+
+def bsp_configuration_file(prog = None):
     '''Return the path to the BSP configuration file for RTEMS. The path is
     relative to the installed executable or we are testing and running from
@@ -95,5 +101,5 @@
 
     '''
-    return configuration_file('rtems-bsps.ini')
+    return configuration_file('rtems-bsps.ini', prog = prog)
 
 class configuration:
@@ -228,5 +234,5 @@
 
     def archs(self):
-        return sorted(self.archs.keys())
+        return sorted(list(self.archs.keys()))
 
     def arch_present(self, arch):
@@ -234,5 +240,5 @@
 
     def arch_excludes(self, arch):
-        excludes = self.archs[arch]['excludes'].keys()
+        excludes = list(self.archs[arch]['excludes'].keys())
         for exclude in self.archs[arch]['excludes']:
             if 'all' not in self.archs[arch]['excludes'][exclude]:
@@ -247,5 +253,5 @@
 
     def bsp_excludes(self, arch, bsp):
-        excludes = self.archs[arch]['excludes'].keys()
+        excludes = list(self.archs[arch]['excludes'].keys())
         for exclude in self.archs[arch]['excludes']:
             if 'all' not in self.archs[arch]['excludes'][exclude] and \
@@ -363,5 +369,5 @@
         if architectures:
             s += textbox.line(cols_1, line = '=', marker = '+', indent = 1)
-            archs = sorted(self.archs.keys())
+            archs = sorted(list(self.archs.keys()))
             bsps = 0
             asize = 0
Index: rtemstoolkit/wscript
===================================================================
--- rtemstoolkit/wscript	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ rtemstoolkit/wscript	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -156,4 +156,7 @@
         install_from = '.',
         install_path = '${PREFIX}/share/rtems/rtemstoolkit')
+    bld.install_files('${PREFIX}/share/rtems/rtemstoolkit',
+                      'python-wrapper.sh',
+                      relative_trick = True)
 
 def rebuild(ctx):
Index: tester/rt/check.py
===================================================================
--- tester/rt/check.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/check.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -972,5 +972,5 @@
         for c in cmds:
             c = c.replace('@PREFIX@', self.prefix)
-            c = c.replace('@RTEMS_VERSION@', self.rtems_version)
+            c = c.replace('@RTEMS_VERSION@', str(self.rtems_version))
             c = c.replace('@ARCH@', build.arch)
             c = c.replace('@BSP@', build.bsp)
@@ -1119,5 +1119,5 @@
         self.run_jobs(self.profile_jobs(profiles))
 
-def run_args(args):
+def run(args):
     b = None
     ec = 0
@@ -1130,7 +1130,13 @@
         build_dir = 'bsp-builds'
         logf = 'bsp-build-%s.txt' % (_now().strftime('%Y%m%d-%H%M%S'))
-        config_file = rtems.bsp_configuration_file()
-
-        argsp = argparse.ArgumentParser()
+        config_file = rtems.bsp_configuration_file(prog = args[0])
+
+        description  = 'RTEMS BSP Builder is a BSP build tester. It builds BSPs '
+        description += 'in various ways to test build regressions in the kernel. You '
+        description += 'can build based on tier, architecture, or BSP. You can control '
+        description += 'the profile of build with various build configuration settings.'
+
+        argsp = argparse.ArgumentParser(prog = 'rtems-bsp-builder',
+                                        description = description)
         argsp.add_argument('--prefix', help = 'Prefix to build the BSP.',
                            type = str)
@@ -1298,7 +1304,4 @@
     sys.exit(ec)
 
-def run():
-    run_args(sys.argv)
-
 if __name__ == "__main__":
-    run()
+    run(sys.argv)
Index: tester/rt/cmd-bsp-builder.py
===================================================================
--- tester/rt/cmd-bsp-builder.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
+++ tester/rt/cmd-bsp-builder.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2016 Chris Johns (chrisj@rtems.org)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from __future__ import print_function
+
+import sys, os
+
+base = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
+rtems = os.path.dirname(base)
+sys.path = [rtems] + sys.path
+
+try:
+    import check
+    check.run(sys.argv[1:])
+except ImportError:
+    print("Incorrect RTEMS Tools installation", file = sys.stderr)
+    sys.exit(1)
Index: tester/rt/cmd-run.py
===================================================================
--- tester/rt/cmd-run.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
+++ tester/rt/cmd-run.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -0,0 +1,44 @@
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2017 Chris Johns (chrisj@rtems.org)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from __future__ import print_function
+
+import sys, os
+
+base = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
+rtems = os.path.dirname(base)
+sys.path = [rtems] + sys.path
+
+try:
+    import run
+    run.run(sys.argv[1:], command_path = base)
+except ImportError:
+    print("Incorrect RTEMS Tools installation", file = sys.stderr)
+    sys.exit(1)
Index: tester/rt/cmd-test.py
===================================================================
--- tester/rt/cmd-test.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
+++ tester/rt/cmd-test.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2013, 2015 Chris Johns (chrisj@rtems.org)
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+from __future__ import print_function
+
+import sys, os
+
+base = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
+rtems = os.path.dirname(base)
+sys.path = [rtems] + sys.path
+
+try:
+    import test
+    test.run(sys.argv[1:], command_path = base)
+except ImportError:
+    print("Incorrect RTEMS Tools installation", file = sys.stderr)
+    sys.exit(1)
Index: tester/rt/config.py
===================================================================
--- tester/rt/config.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/config.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -47,7 +47,7 @@
 from rtemstoolkit import path
 
-from . import console
-from . import gdb
-from . import tftp
+import console
+import gdb
+import tftp
 
 timeout = 15
Index: tester/rt/console.py
===================================================================
--- tester/rt/console.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/console.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -42,5 +42,5 @@
 from rtemstoolkit import path
 
-from . import telnet
+import telnet
 
 #
@@ -48,5 +48,5 @@
 #
 if os.name != 'nt':
-    from . import stty
+    import stty
 else:
     stty = None
@@ -108,4 +108,7 @@
                 try:
                     data = me.tty.read()
+                    if isinstance(data, bytes):
+                        data = data.decode('utf-8', 'ignore')
+                    data = [c for c in data if ord(c) < 128]
                 except IOError as ioe:
                     if ioe.errno == errno.EAGAIN:
Index: tester/rt/coverage.py
===================================================================
--- tester/rt/coverage.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/coverage.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -48,5 +48,5 @@
 
 
-from . import options
+import options
 
 class summary:
Index: tester/rt/gdb.py
===================================================================
--- tester/rt/gdb.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/gdb.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -49,14 +49,6 @@
 from rtemstoolkit import path
 
-#
-# Support to handle use in a package and as a unit test.
-# If there is a better way to let us know.
-#
-try:
-    from . import console
-    from . import pygdb
-except (ValueError, SystemError):
-    import console
-    import pygdb
+import console
+import pygdb
 
 #
Index: tester/rt/run.py
===================================================================
--- tester/rt/run.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/run.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -33,10 +33,6 @@
 import copy
 import datetime
-import fnmatch
-import os
-import re
 import sys
 import threading
-import time
 
 from rtemstoolkit import error
@@ -47,9 +43,9 @@
 from rtemstoolkit import version
 
-from . import bsps
-from . import config
-from . import console
-from . import options
-from . import report
+import bsps
+import config
+import console
+import options
+import report
 
 class test(object):
@@ -99,6 +95,5 @@
     raise error.exit()
 
-def run(command_path = None):
-    import sys
+def run(args, command_path = None):
     tests = []
     stdtty = console.save()
@@ -112,5 +107,5 @@
                     '--debug-trace': 'Debug trace based on specific flags',
                     '--stacktrace':  'Dump a stack trace on a user termination (^C)' }
-        opts = options.load(sys.argv,
+        opts = options.load(args,
                             optargs = optargs,
                             command_path = command_path)
Index: tester/rt/stty.py
===================================================================
--- tester/rt/stty.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/stty.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -59,5 +59,5 @@
         termios.tcsetattr(sys.stderr, termios.TCSANOW, attributes[2])
 
-class tty:
+class tty(object):
 
     raw = 'B115200,~BRKINT,IGNBRK,IGNCR,~ICANON,~ISIG,~IEXTEN,~ECHO,CLOCAL,~CRTSCTS'
Index: tester/rt/test.py
===================================================================
--- tester/rt/test.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/test.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -51,10 +51,10 @@
 from rtemstoolkit import check
 
-from . import bsps
-from . import config
-from . import console
-from . import options
-from . import report
-from . import coverage
+import bsps
+import config
+import console
+import options
+import report
+import coverage
 
 class log_capture(object):
@@ -217,5 +217,5 @@
         test.kill()
 
-def run(command_path = None):
+def run(args, command_path = None):
     import sys
     tests = []
@@ -235,5 +235,5 @@
                     '--coverage':       'Perform coverage analysis of test executables.'}
         mailer.append_options(optargs)
-        opts = options.load(sys.argv,
+        opts = options.load(args,
                             optargs = optargs,
                             command_path = command_path)
Index: tester/rt/tftp.py
===================================================================
--- tester/rt/tftp.py	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rt/tftp.py	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -44,12 +44,5 @@
 from rtemstoolkit import reraise
 
-#
-# Support to handle use in a package and as a unit test.
-# If there is a better way to let us know.
-#
-try:
-    from . import tftpy
-except (ValueError, SystemError):
-    import tftpy
+import tftpy
 
 class tftp(object):
Index: tester/rtems-bsp-builder
===================================================================
--- tester/rtems-bsp-builder	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rtems-bsp-builder	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -1,6 +1,6 @@
-#! /usr/bin/env python
+#! /bin/sh
 #
 # RTEMS Tools Project (http://www.rtems.org/)
-# Copyright 2016 Chris Johns (chrisj@rtems.org)
+# Copyright 2018 Chris Johns (chrisj@rtems.org)
 # All rights reserved.
 #
@@ -29,15 +29,14 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
-
-import sys, os
-base = os.path.dirname(os.path.abspath(sys.argv[0]))
-parent = os.path.dirname(base)
-rtems = os.path.join(parent, 'share', 'rtems')
-sys.path = [parent, rtems, os.path.join(rtems, 'tester')] + sys.path
-
-try:
-    import rt.check
-    rt.check.run()
-except ImportError:
-    print >> sys.stderr, "Incorrect RTEMS Tools installation"
-    sys.exit(1)
+set -e
+base=$(dirname $(dirname $0))
+cmd=tester/rt/cmd-bsp-builder.py
+PYTHON_WRAPPER=rtemstoolkit/python-wrapper.sh
+if test -f ${base}/${PYTHON_WRAPPER}; then
+  PYTHON_CMD=${base}/${cmd}
+  . ${base}/${PYTHON_WRAPPER}
+elif test -f ${base}/share/rtems/${PYTHON_WRAPPER}; then
+  PYTHON_CMD=${base}/share/rtems/${cmd}
+  . ${base}/share/rtems/${PYTHON_WRAPPER}
+fi
+echo "error: RTEMS Toolkit python wrapper not found, plrease report"
Index: tester/rtems-run
===================================================================
--- tester/rtems-run	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rtems-run	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -1,6 +1,6 @@
-#! /usr/bin/env python
+#! /bin/sh
 #
 # RTEMS Tools Project (http://www.rtems.org/)
-# Copyright 2017 Chris Johns (chrisj@rtems.org)
+# Copyright 2018 Chris Johns (chrisj@rtems.org)
 # All rights reserved.
 #
@@ -29,15 +29,14 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
-
-import sys, os
-base = os.path.dirname(os.path.abspath(sys.argv[0]))
-parent = os.path.dirname(base)
-rtems = os.path.join(parent, 'share', 'rtems')
-sys.path = [parent, rtems, os.path.join(rtems, 'tester')] + sys.path
-
-try:
-    import rt.run
-    rt.run.run()
-except ImportError:
-    print >> sys.stderr, "Incorrect RTEMS Tools installation"
-    sys.exit(1)
+set -e
+base=$(dirname $(dirname $0))
+cmd=tester/rt/cmd-run.py
+PYTHON_WRAPPER=rtemstoolkit/python-wrapper.sh
+if test -f ${base}/${PYTHON_WRAPPER}; then
+  PYTHON_CMD=${base}/${cmd}
+  . ${base}/${PYTHON_WRAPPER}
+elif test -f ${base}/share/rtems/${PYTHON_WRAPPER}; then
+  PYTHON_CMD=${base}/share/rtems/${cmd}
+  . ${base}/share/rtems/${PYTHON_WRAPPER}
+fi
+echo "error: RTEMS Toolkit python wrapper not found, plrease report"
Index: tester/rtems-test
===================================================================
--- tester/rtems-test	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/rtems-test	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -1,6 +1,6 @@
-#! /usr/bin/env python
+#! /bin/sh
 #
 # RTEMS Tools Project (http://www.rtems.org/)
-# Copyright 2013, 2015 Chris Johns (chrisj@rtems.org)
+# Copyright 2018 Chris Johns (chrisj@rtems.org)
 # All rights reserved.
 #
@@ -29,15 +29,14 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
-
-import sys, os
-base = os.path.dirname(os.path.abspath(sys.argv[0]))
-parent = os.path.dirname(base)
-rtems = os.path.join(parent, 'share', 'rtems')
-sys.path = [parent, rtems, os.path.join(rtems, 'tester')] + sys.path
-
-try:
-    import rt.test
-    rt.test.run()
-except ImportError:
-    print >> sys.stderr, "Incorrect RTEMS Tools installation"
-    sys.exit(1)
+set -e
+base=$(dirname $(dirname $0))
+cmd=tester/rt/cmd-test.py
+PYTHON_WRAPPER=rtemstoolkit/python-wrapper.sh
+if test -f ${base}/${PYTHON_WRAPPER}; then
+  PYTHON_CMD=${base}/${cmd}
+  . ${base}/${PYTHON_WRAPPER}
+elif test -f ${base}/share/rtems/${PYTHON_WRAPPER}; then
+  PYTHON_CMD=${base}/share/rtems/${cmd}
+  . ${base}/share/rtems/${PYTHON_WRAPPER}
+fi
+echo "error: RTEMS Toolkit python wrapper not found, plrease report"
Index: tester/wscript
===================================================================
--- tester/wscript	(revision 087be8c67f04d9f3457e9c74a97e636bec202ead)
+++ tester/wscript	(revision e058db02816d7729e7cfa898522a6073f5d7e714)
@@ -55,4 +55,7 @@
                   'rt/bsps.py',
                   'rt/check.py',
+                  'rt/cmd-bsp-builder.py',
+                  'rt/cmd-run.py',
+                  'rt/cmd-test.py',
                   'rt/config.py',
                   'rt/console.py',
