Skip to content

Commit 56e1e39

Browse files
committed
Refactor bootstrap and support -m to execute a module
1 parent 8d8629b commit 56e1e39

File tree

1 file changed

+62
-32
lines changed

1 file changed

+62
-32
lines changed

bootstrap.py

+62-32
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import distutils.util
1919
import subprocess
2020
import logging
21+
import collections
22+
from argparse import ArgumentParser
2123

2224
logging.basicConfig()
2325
logger = logging.getLogger("bootstrap")
@@ -187,48 +189,50 @@ def find_executable(target):
187189
return None, None
188190

189191

190-
if __name__ == "__main__":
191-
home = os.path.dirname(os.path.abspath(__file__))
192-
LIBPATH = os.path.join(home, 'build', _distutils_dir_name('lib'))
193-
cwd = os.getcwd()
194-
os.chdir(home)
195-
build = subprocess.Popen([sys.executable, "setup.py", "build"],
196-
shell=False, cwd=os.path.dirname(os.path.abspath(__file__)))
197-
build_rc = build.wait()
198-
if not os.path.exists(LIBPATH):
199-
logger.warning("`lib` directory does not exist, trying common Python3 lib")
200-
LIBPATH = os.path.join(os.path.split(LIBPATH)[0], "lib")
201-
os.chdir(cwd)
202-
203-
if build_rc == 0:
204-
logger.info("Build process ended.")
205-
else:
206-
logger.error("Build process ended with rc=%s", build_rc)
207-
sys.exit(-1)
208-
209-
if len(sys.argv) < 2:
210-
logger.warning("usage: ./bootstrap.py <script>\n")
211-
script = None
212-
else:
213-
script = sys.argv[1]
192+
def main(argv):
193+
parser = ArgumentParser(prog="bootstrap", usage="./bootstrap.py <script>",
194+
description=__doc__)
195+
parser.add_argument("script", nargs="*")
196+
parser.add_argument("-m", help="run library module as a script (terminates option list)")
214197

215-
if script:
216-
logger.info("Executing %s from source checkout", script)
198+
Options = collections.namedtuple("Options", ["script", "module"])
199+
if len(argv) == 1:
200+
options = Options(script=None, module=None)
217201
else:
218-
logging.info("Running iPython by default")
219-
sys.path.insert(0, LIBPATH)
220-
logger.info("Patched sys.path with %s", LIBPATH)
202+
if argv[1] in ["-h", "--help"]:
203+
parser.print_help()
204+
return
205+
if argv[1] == "-m":
206+
if len(argv) < 3:
207+
parser.parse_args(argv[1:])
208+
return
209+
options = Options(script=None, module=argv[2:])
210+
else:
211+
options = Options(script=argv[1:], module=None)
221212

222-
if script:
223-
argv = sys.argv[2:]
213+
if options.script is not None:
214+
logger.info("Executing %s from source checkout", options.script)
215+
script = options.script[0]
216+
argv = options.script[1:]
224217
kind, target = find_executable(script)
225218
if kind == "path":
226219
run_file(target, argv)
227220
elif kind == "entry_point":
228221
run_entry_point(target, argv)
229222
else:
230-
logger.error("Script %s not found", script)
223+
logger.error("Script %s not found", options.script)
224+
elif options.module is not None:
225+
logging.info("Running module %s", options.module)
226+
import runpy
227+
module = options.module[0]
228+
try:
229+
old = sys.argv
230+
sys.argv = [None] + options.module[1:]
231+
runpy.run_module(module, run_name="__main__", alter_sys=True)
232+
finally:
233+
sys.argv = old
231234
else:
235+
logging.info("Running IPython by default")
232236
logger.info("Patch the sys.argv: %s", sys.argv)
233237
sys.path.insert(2, "")
234238
try:
@@ -240,3 +244,29 @@ def find_executable(target):
240244
code.interact()
241245
else:
242246
embed()
247+
248+
249+
if __name__ == "__main__":
250+
home = os.path.dirname(os.path.abspath(__file__))
251+
LIBPATH = os.path.join(home, 'build', _distutils_dir_name('lib'))
252+
cwd = os.getcwd()
253+
os.chdir(home)
254+
build = subprocess.Popen([sys.executable, "setup.py", "build"],
255+
shell=False, cwd=os.path.dirname(os.path.abspath(__file__)))
256+
build_rc = build.wait()
257+
if not os.path.exists(LIBPATH):
258+
logger.warning("`lib` directory does not exist, trying common Python3 lib")
259+
LIBPATH = os.path.join(os.path.split(LIBPATH)[0], "lib")
260+
os.chdir(cwd)
261+
262+
if build_rc == 0:
263+
logger.info("Build process ended.")
264+
else:
265+
logger.error("Build process ended with rc=%s", build_rc)
266+
sys.exit(-1)
267+
268+
sys.path.insert(0, LIBPATH)
269+
logger.info("Patched sys.path with %s", LIBPATH)
270+
271+
main(sys.argv)
272+

0 commit comments

Comments
 (0)