Merge pull request #693 from rwtolbert/features/run_module_as_main
Implement -m command line flag to run a module by name
This commit is contained in:
commit
2fd9c91cd3
@ -23,6 +23,16 @@ Command line options
|
|||||||
|
|
||||||
Execute the Hy code in *command*, then stay in REPL.
|
Execute the Hy code in *command*, then stay in REPL.
|
||||||
|
|
||||||
|
.. cmdoption:: -m <module>
|
||||||
|
|
||||||
|
Execute the Hy code in *module*, including ``defmain`` if defined.
|
||||||
|
|
||||||
|
The :option:`-m` flag terminates the options list so that
|
||||||
|
all arguments after the *module* name are passed to the module in
|
||||||
|
``sys.argv``.
|
||||||
|
|
||||||
|
.. versionadded:: 0.10.2
|
||||||
|
|
||||||
.. cmdoption:: --spy
|
.. cmdoption:: --spy
|
||||||
|
|
||||||
Print equivalent Python code before executing. For example::
|
Print equivalent Python code before executing. For example::
|
||||||
|
@ -188,6 +188,18 @@ def run_command(source):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def run_module(mod_name):
|
||||||
|
from hy.importer import MetaImporter
|
||||||
|
pth = MetaImporter().find_on_path(mod_name)
|
||||||
|
if pth is not None:
|
||||||
|
sys.argv = [pth] + sys.argv
|
||||||
|
return run_file(pth)
|
||||||
|
|
||||||
|
sys.stderr.write("{0}: module '{1}' not found.\n".format(hy.__appname__,
|
||||||
|
mod_name))
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
def run_file(filename):
|
def run_file(filename):
|
||||||
from hy.importer import import_file_to_module
|
from hy.importer import import_file_to_module
|
||||||
try:
|
try:
|
||||||
@ -230,9 +242,10 @@ def run_icommand(source, spy=False):
|
|||||||
return run_repl(hr)
|
return run_repl(hr)
|
||||||
|
|
||||||
|
|
||||||
USAGE = "%(prog)s [-h | -i cmd | -c cmd | file | -] [arg] ..."
|
USAGE = "%(prog)s [-h | -i cmd | -c cmd | -m module | file | -] [arg] ..."
|
||||||
VERSION = "%(prog)s " + hy.__version__
|
VERSION = "%(prog)s " + hy.__version__
|
||||||
EPILOG = """ file program read from script
|
EPILOG = """ file program read from script
|
||||||
|
module module to execute as main
|
||||||
- program read from stdin
|
- program read from stdin
|
||||||
[arg] ... arguments passed to program in sys.argv[1:]
|
[arg] ... arguments passed to program in sys.argv[1:]
|
||||||
"""
|
"""
|
||||||
@ -246,6 +259,8 @@ def cmdline_handler(scriptname, argv):
|
|||||||
epilog=EPILOG)
|
epilog=EPILOG)
|
||||||
parser.add_argument("-c", dest="command",
|
parser.add_argument("-c", dest="command",
|
||||||
help="program passed in as a string")
|
help="program passed in as a string")
|
||||||
|
parser.add_argument("-m", dest="mod",
|
||||||
|
help="module to run, passed in as a string")
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-i", dest="icommand",
|
"-i", dest="icommand",
|
||||||
help="program passed in as a string, then stay in REPL")
|
help="program passed in as a string, then stay in REPL")
|
||||||
@ -265,6 +280,16 @@ def cmdline_handler(scriptname, argv):
|
|||||||
# mimics Python sys.executable
|
# mimics Python sys.executable
|
||||||
hy.executable = argv[0]
|
hy.executable = argv[0]
|
||||||
|
|
||||||
|
# need to split the args if using "-m"
|
||||||
|
# all args after the MOD are sent to the module
|
||||||
|
# in sys.argv
|
||||||
|
module_args = []
|
||||||
|
if "-m" in argv:
|
||||||
|
mloc = argv.index("-m")
|
||||||
|
if len(argv) > mloc+2:
|
||||||
|
module_args = argv[mloc+2:]
|
||||||
|
argv = argv[:mloc+2]
|
||||||
|
|
||||||
options = parser.parse_args(argv[1:])
|
options = parser.parse_args(argv[1:])
|
||||||
|
|
||||||
if options.show_tracebacks:
|
if options.show_tracebacks:
|
||||||
@ -272,12 +297,16 @@ def cmdline_handler(scriptname, argv):
|
|||||||
SIMPLE_TRACEBACKS = False
|
SIMPLE_TRACEBACKS = False
|
||||||
|
|
||||||
# reset sys.argv like Python
|
# reset sys.argv like Python
|
||||||
sys.argv = options.args or [""]
|
sys.argv = options.args + module_args or [""]
|
||||||
|
|
||||||
if options.command:
|
if options.command:
|
||||||
# User did "hy -c ..."
|
# User did "hy -c ..."
|
||||||
return run_command(options.command)
|
return run_command(options.command)
|
||||||
|
|
||||||
|
if options.mod:
|
||||||
|
# User did "hy -m ..."
|
||||||
|
return run_module(options.mod)
|
||||||
|
|
||||||
if options.icommand:
|
if options.icommand:
|
||||||
# User did "hy -i ..."
|
# User did "hy -i ..."
|
||||||
return run_icommand(options.icommand, spy=options.spy)
|
return run_icommand(options.icommand, spy=options.spy)
|
||||||
|
0
tests/resources/bin/__init__.hy
Normal file
0
tests/resources/bin/__init__.hy
Normal file
@ -173,3 +173,27 @@ def test_bin_hy_no_main():
|
|||||||
ret = run_cmd("hy tests/resources/bin/nomain.hy")
|
ret = run_cmd("hy tests/resources/bin/nomain.hy")
|
||||||
assert ret[0] == 0
|
assert ret[0] == 0
|
||||||
assert "This Should Still Work" in ret[1]
|
assert "This Should Still Work" in ret[1]
|
||||||
|
|
||||||
|
|
||||||
|
def test_bin_hy_module_main():
|
||||||
|
ret = run_cmd("hy -m tests.resources.bin.main")
|
||||||
|
assert ret[0] == 0
|
||||||
|
assert "Hello World" in ret[1]
|
||||||
|
|
||||||
|
|
||||||
|
def test_bin_hy_module_main_args():
|
||||||
|
ret = run_cmd("hy -m tests.resources.bin.main test 123")
|
||||||
|
assert ret[0] == 0
|
||||||
|
assert "test" in ret[1]
|
||||||
|
assert "123" in ret[1]
|
||||||
|
|
||||||
|
|
||||||
|
def test_bin_hy_module_main_exitvalue():
|
||||||
|
ret = run_cmd("hy -m tests.resources.bin.main exit1")
|
||||||
|
assert ret[0] == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_bin_hy_module_no_main():
|
||||||
|
ret = run_cmd("hy -m tests.resources.bin.nomain")
|
||||||
|
assert ret[0] == 0
|
||||||
|
assert "This Should Still Work" in ret[1]
|
||||||
|
Loading…
Reference in New Issue
Block a user