Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python calling a module that uses argparser

Tags:

This is probably a silly question, but I have a python script that current takes in a bunch of arguements using argparser and I would like to load this script as a module in another python script, which is fine. But I am not sure how to call the module as no function is defined; can I still call it the same way I do if I was just invoking it from cmd?

Here is the child script:

import argparse as ap from subprocess import Popen, PIPE  parser = ap.ArgumentParser(     description='Gathers parameters.') parser.add_argument('-f', metavar='--file', type=ap.FileType('r'), action='store', dest='file',                     required=True, help='Path to json parameter file') parser.add_argument('-t', metavar='--type', type=str, action='store', dest='type',                     required=True, help='Type of parameter file.') parser.add_argument('-g', metavar='--group', type=str, action='store', dest='group',                     required=False, help='Group to apply parameters to') # Gather the provided arguements as an array. args = parser.parse_args()  ... Do stuff in the script 

and here is the parent script that I want to invoke the child script from; it also uses arg parser and does some other logic

from configuration import parameterscript as paramscript  # Can I do something like this? paramscript('parameters/test.params.json', test) 

Inside the configuration directory, I also created an init.py file that is empty.

like image 386
Pectus Excavatum Avatar asked Jun 24 '17 09:06

Pectus Excavatum


People also ask

How do you parse arguments in Python?

Argument Parsing using sys.Your program will accept an arbitrary number of arguments passed from the command-line (or terminal) while getting executed. The program will print out the arguments that were passed and the total number of arguments. Notice that the first argument is always the name of the Python file.

What is Store_true in Python?

The store_true option automatically creates a default value of False. Likewise, store_false will default to True when the command-line argument is not present.


Video Answer


2 Answers

The first argument to parse_args is a list of arguments. By default it's None which means use sys.argv. So you can arrange your script like this:

import argparse as ap  def main(raw_args=None):     parser = ap.ArgumentParser(         description='Gathers parameters.')     parser.add_argument('-f', metavar='--file', type=ap.FileType('r'), action='store', dest='file',                         required=True, help='Path to json parameter file')     parser.add_argument('-t', metavar='--type', type=str, action='store', dest='type',                         required=True, help='Type of parameter file.')     parser.add_argument('-g', metavar='--group', type=str, action='store', dest='group',                         required=False, help='Group to apply parameters to')     # Gather the provided arguements as an array.     args = parser.parse_args(raw_args)     print(vars(args))   # Run with command line arguments precisely when called directly # (rather than when imported) if __name__ == '__main__':     main() 

And then elsewhere:

from first_module import main  main(['-f', '/etc/hosts', '-t', 'json']) 

Output:

{'group': None, 'file': <_io.TextIOWrapper name='/etc/hosts' mode='r' encoding='UTF-8'>, 'type': 'json'} 
like image 99
Alex Hall Avatar answered Nov 12 '22 04:11

Alex Hall


There may be a simpler and more pythonic way to do this, but here is one possibility using the subprocess module:

Example:

child_script.py

import argparse  parser = argparse.ArgumentParser() parser.add_argument("-n", "--name", help="your name") args = parser.parse_args()  print("hello there {}").format(args.name) 

Then another Python script can call that script like so:

calling_script.py:

import subprocess  # using Popen may suit better here depending on how you want to deal # with the output of the child_script. subprocess.call(["python", "child_script.py", "-n", "Donny"]) 

Executing the above script would give the following output:

"hello there Donny" 
like image 39
Totem Avatar answered Nov 12 '22 04:11

Totem