I’m wondering if it’s possible to populate sys.argv
(or some other structure) with command line arguments in a jupyter/ipython notebook, similar to how it’s done through a python script.
For instance, if I were to run a python script as follows:
python test.py False
Then sys.argv
would contain the argument False
. But if I run a jupyter notebook in a similar manner:
jupyter notebook test.ipynb False
Then the command line argument gets lost. Is there any way to access this argument from within the notebook itself?
Advertisement
Answer
After a lot of looking around I found very cumbersome, custom libraries, but solved it with a few lines of code which I thought was pretty slick. I used nbconvert to end up with an html report as output that contains all graphics and markdown from the notebook, but accepts command line parameters just as always through a minimal python wrapper:
The python file test_args.py (which takes command line params as normal):
import sys,os IPYNB_FILENAME = 'test_argv.ipynb' CONFIG_FILENAME = '.config_ipynb' def main(argv): with open(CONFIG_FILENAME,'w') as f: f.write(' '.join(argv)) os.system('jupyter nbconvert --execute {:s} --to html'.format(IPYNB_FILENAME)) return None if __name__ == '__main__': main(sys.argv)
The notebook contains:
import sys,os,argparse from IPython.display import HTML CONFIG_FILE = '.config_ipynb' if os.path.isfile(CONFIG_FILE): with open(CONFIG_FILE) as f: sys.argv = f.read().split() else: sys.argv = ['test_args.py', 'input_file', '--int_param', '12'] parser = argparse.ArgumentParser() parser.add_argument("input_file",help="Input image, directory, or npy.") parser.add_argument("--int_param", type=int, default=4, help="an optional integer parameter.") args = parser.parse_args() p = args.int_param print(args.input_file,p)
and I can run the python notebook with arguments parsed as usual:
python test_args.py my_input_file --int_param 12
I tend to paste the block with argparse calls into the python wrapper so that command line errors are caught by the python script and -h works properly.