0

Ok, so lets say I have this part of the code (it is not perfect). I want this scenario - I am detecting the cloud name ones as an argument in __init__ so all other modules and scripts will run on that cloud, or if I want to run the specific python file from the terminal I can detect the cloud on which I want it to be runned like this python my_script.py cloud1 What would be the best way to do this? The following script does work when I am running it from the terminal with the argument, but if not it gives this error

usage: To check what is the cloud name config_parser.py: error: too few arguments'

here is a code

class CredentialsCP:

def __init__(self, cloud_name=None):
    self.config = ConfigParser.ConfigParser()
    self.cloud_name = cloud_name
    self.config_file_pass = os.path.expanduser('~/PycharmProjects/ui/config.cfg')
    self.parser = ArgumentParser(usage='To check what is the cloud name')
    self.parser.add_argument('cloud')
    self.args = self.parser.parse_args()
    if self.args:
        self.cloud_name = self.args.cloud
    if self.cloud_name is None:
        self.cloud_name = 'cloud1'

I have a function that shows a url of the cloud, that how it is callable

Adiia
  • 77
  • 2
  • 8

1 Answers1

0

ArgumentParser has provision for optional arguments, but the default for positional (non flag) arguments is required. Here you could use:

self.parser = ArgumentParser(usage='To check what is the cloud name')
self.parser.add_argument('cloud', nargs='?', default='cloud1') # optional argument with default value
self.args = self.parser.parse_args()
self.cloud_name = self.args.cloud

Possible improvements:

In this code, parser and args are member attributes of the class. If they are not used outside the __init__ method, they could just be locals:

self.parser = ArgumentParser(usage='To check what is the cloud name')
parser.add_argument('cloud', nargs='?', default='cloud1') # optional argument with default value
args = .parser.parse_args()
self.cloud_name = args.cloud

For only identifying a single optional argument, argparse may be overkill. sys.argv could be enough:

...
self.config_file_pass = os.path.expanduser('~/PycharmProjects/ui/config.cfg')
self.cloud_name = sys.argv[1] if len(sys.argv) > 1 else 'cloud1'
Serge Ballesta
  • 143,923
  • 11
  • 122
  • 252
  • It works if I rut it from the file where my class is written, but when I import a module to the different file to use it there it gives an error "NoSectionError: No section:" Do you know what might be a reason and is there any ways to fix it? @SergeBallesta – Adiia Jun 20 '18 at 14:30
  • @Nadiia: That is a different problem. *NoSectionError: No section* is normaly an error from the configparser module. You could try to check that the .cfg file exists and is accessible... – Serge Ballesta Jun 20 '18 at 15:59