pyFAI/bootstrap.py

179 lines
6.2 KiB
Python
Raw Normal View History

#!/usr/bin/env python
# -*- coding: utf-8 -*-
2017-05-15 22:05:10 +08:00
# Project: Fast Azimuthal integration
# https://github.com/silx-kit/pyFAI
#
# Copyright (C) European Synchrotron Radiation Facility, Grenoble, France
#
# Principal author: Jérôme Kieffer (Jerome.Kieffer@ESRF.eu)
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# .
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# .
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
"""
2015-11-21 18:24:00 +08:00
Bootstrap helps you to test pyFAI scripts without installing them
2014-11-28 01:42:28 +08:00
by patching your PYTHONPATH on the fly
example: ./bootstrap.py pyFAI-integrate test/testimages/Pilatus1M.edf
"""
__authors__ = ["Frédéric-Emmanuel Picca", "Jérôme Kieffer"]
__contact__ = "jerome.kieffer@esrf.eu"
2017-05-15 22:05:10 +08:00
__license__ = "MIT"
__date__ = "15/05/2017"
2014-11-28 01:42:28 +08:00
import sys
import os
import distutils.util
import distutils.dir_util
import subprocess
import logging
2015-11-21 18:24:00 +08:00
def _distutils_dir_name(dname="lib"):
"""
Returns the name of a distutils build directory
"""
platform = distutils.util.get_platform()
architecture = "%s.%s-%i.%i" % (dname, platform,
sys.version_info[0], sys.version_info[1])
return architecture
def _distutils_scripts_name():
"""Return the name of the distrutils scripts sirectory"""
f = "scripts-{version[0]}.{version[1]}"
return f.format(version=sys.version_info)
def _get_available_scripts(path):
res = []
try:
res = " ".join([s.rstrip('.py') for s in os.listdir(path)])
except OSError:
res = ["no script available, did you ran "
"'python setup.py build' before bootstrapping ?"]
return res
2014-11-27 20:56:37 +08:00
2016-03-22 16:41:41 +08:00
if sys.version_info[0] >= 3: # Python3
def execfile(fullpath):
"Python3 implementation for execfile"
with open(fullpath) as f:
code = compile(f.read(), fullpath, 'exec')
exec(code)
def runfile(fname):
try:
execfile(fname)
2016-06-16 23:23:36 +08:00
except (SyntaxError, NameError) as error:
2016-04-05 22:07:48 +08:00
print(error)
env = os.environ.copy()
env.update({"PYTHONPATH": LIBPATH + os.pathsep + os.environ.get("PYTHONPATH", ""),
"PATH": SCRIPTSPATH + os.pathsep + os.environ.get("PATH", "")})
run = subprocess.Popen(sys.argv, shell=False, env=env)
run.wait()
def get_project_name(root_dir):
"""Retrieve project name by running python setup.py --name in root_dir.
:param str root_dir: Directory where to run the command.
:return: The name of the project stored in root_dir
"""
logger.debug("Getting project name in %s", root_dir)
p = subprocess.Popen([sys.executable, "setup.py", "--name"],
shell=False, cwd=root_dir, stdout=subprocess.PIPE)
name, _stderr_data = p.communicate()
logger.debug("subprocess ended with rc= %s", p.returncode)
return name.split()[-1].decode('ascii')
2016-06-15 22:10:23 +08:00
logging.basicConfig()
2016-06-15 22:08:41 +08:00
logger = logging.getLogger("bootstrap")
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_NAME = get_project_name(PROJECT_DIR)
2016-06-15 22:08:41 +08:00
home = os.path.dirname(os.path.abspath(__file__))
SCRIPTSPATH = os.path.join(home, 'build', _distutils_scripts_name())
LIBPATH = os.path.join(home, 'build', _distutils_dir_name('lib'))
2016-03-22 16:41:41 +08:00
cwd = os.getcwd()
os.chdir(home)
build = subprocess.Popen([sys.executable, "setup.py", "build"],
shell=False, cwd=os.path.dirname(os.path.abspath(__file__)))
logger.info("Build process ended with rc= %s", build.wait())
distutils.dir_util.copy_tree("pyFAI/resources", os.path.join(LIBPATH, PROJECT_NAME, "resources"), update=1)
2016-03-22 16:41:41 +08:00
os.chdir(cwd)
if __name__ == "__main__":
if len(sys.argv) < 2:
logging.warning("usage: ./bootstrap.py <script>\n")
logging.warning("Available scripts : %s\n" %
_get_available_scripts(SCRIPTSPATH))
script = None
else:
script = sys.argv[1]
if script:
logger.info("Executing %s from source checkout", script)
else:
logging.info("Running iPython by default")
sys.path.insert(0, LIBPATH)
logger.info("01. Patched sys.path with %s", LIBPATH)
sys.path.insert(0, SCRIPTSPATH)
logger.info("02. Patched sys.path with %s", SCRIPTSPATH)
if script:
sys.argv = sys.argv[1:]
logger.info("03. patch the sys.argv: %s", sys.argv)
logger.info("04. Executing %s.main()", script)
fullpath = os.path.join(SCRIPTSPATH, script)
if os.path.exists(fullpath):
2016-06-15 21:59:47 +08:00
exec_file = fullpath
else:
if os.path.exists(script):
2016-06-15 21:59:47 +08:00
exec_file = script
else:
for dirname in os.environ.get("PATH", "").split(os.pathsep):
fullpath = os.path.join(dirname, script)
if os.path.exists(fullpath):
2016-06-15 21:59:47 +08:00
exec_file = fullpath
break
2016-06-15 21:59:47 +08:00
else:
exec_file = None
if exec_file is not None:
runfile(exec_file)
else:
logger.error("Script not found")
else:
logger.info("03. patch the sys.argv: %s", sys.argv)
sys.path.insert(2, "")
try:
from IPython import embed
except Exception as err:
logger.error("Unable to execute iPython, using normal Python")
logger.error(err)
import code
code.interact()
else:
embed()