title: How to pass arguments to main function within Python module?
body: <p>I have recently started learning more about Python Packages and Modules. I'm currently busy updating my existing modules so that that can be run as script or imported as a module into my other code. I'm not sure how to construct my input arguments within my module and pass them to the main() function within my module.</p>
  
  <p>I've have written my my <strong>main()</strong> function and called it under <strong>if __name__ == '__main__'</strong> passing the input arguments. The inputs are currently hard coded to show what I'm trying to achieve. Any help in how to correctly construct my input arguments that the user will pass, which will then be passed onto the main function will be appreciated.</p>
  
  <p>As mentioned I'm trying to be able to use the following as a script when used directly or imported as a module into my other code and run from there. If I import it as a module would I call the <strong>main()</strong> function when importing it? Is the following structure correct in how I have written the following? Any advice is appreciated.</p>
  
  <pre><code>'''
  Created on March 12, 2017
  
  Create a new ArcHydro Schema
  
  File Geodatabase and Rasters
  
  Folder
  
  @author: PeterW
  '''
  # import site-packages and modules
  import re
  from pathlib import Path
  import arcpy
  
  # set environment settings
  arcpy.env.overwriteOutput = True
  
  
  def archydro_rasters_folder(workspace):
      """Create rasters folder directory
      if it doens't already exist"""
      model_name = Path(workspace).name
      layers_name = re.sub(r"\D+", "Layers", model_name)
      layers_folder = Path(workspace, layers_name)
      if layers_folder.exists():
          arcpy.AddMessage("Rasters folder: {0} exists".format(layers_name))
      else:
          layers_folder.mkdir(parents=True)
          arcpy.AddMessage("Rasters folder {0} created".format(layers_name))
  
  
  def archydro_fgdb_schema(workspace, schema, dem):
      """Create file geodatabase using XML
      schema and set coordinate system based
      on input DEM if it doesn't already exist"""
      model_name = Path(workspace).name
      fgdb = "{0}.gdb".format(model_name)
      if arcpy.Exists(str(Path(workspace, fgdb))):
          arcpy.AddMessage("{0} file geodatabase exists".format(fgdb))
      else:
          new_fgdb = arcpy.CreateFileGDB_management(str(workspace), fgdb)
          import_type = "SCHEMA_ONLY"
          config_keyword = "DEFAULTS"
          arcpy.AddMessage("New {0} file geodatabase created".format(fgdb))
          arcpy.ImportXMLWorkspaceDocument_management(new_fgdb, schema,
                                                      import_type,
                                                      config_keyword)
          arcpy.AddMessage("ArcHydro schema imported")
          projection = arcpy.Describe(dem).spatialReference
          projection_name = projection.PCSName
          feature_dataset = Path(workspace, fgdb, "Layers")
          arcpy.DefineProjection_management(str(feature_dataset),
                                            projection)
          arcpy.AddMessage("Changed projection to {0}".format(projection_name))
  
  
  def main(workspace, dem, schema):
      """main function to create rasters folder
      and file geodatabase"""
      archydro_rasters_folder(workspace)
      archydro_fgdb_schema(schema, dem, workspace)
  
  if __name__ == '__main__':
      main(workspace = r"E:\Projects\2016\01_Bertrand_Small_Projects\G113268\ArcHydro\Model04",
           dem = r"E:\Projects\2016\01_Bertrand_Small_Projects\G113268\ArcHydro\DEM2\raw",
           schema = r"E:\Python\Masters\Schema\ESRI_UC12\ModelBuilder\Schema\Model01.xml")
  </code></pre>
  
  <p>Updated: 17/03/13</p>
  
  <p>The following is my updated Python module based on Jonathan's suggestions:</p>
  
  <pre><code>'''
  Created on March 12, 2017
  
  Create a new ArcHydro Schema
  
  File Geodatabase and Rasters
  
  Folder
  
  @author: PeterW
  '''
  # import site-packages and modules
  import re
  from pathlib import Path
  import arcpy
  import argparse
  
  # set environment settings
  arcpy.env.overwriteOutput = True
  
  
  def rasters_directory(workspace):
      """Create rasters folder directory
      if it doens't already exist"""
      model_name = Path(workspace).name
      layers_name = re.sub(r"\D+", "Layers", model_name)
      layers_folder = Path(workspace, layers_name)
      if layers_folder.exists():
          arcpy.AddMessage("Rasters folder: {0} exists".format(layers_name))
      else:
          layers_folder.mkdir(parents=True)
          arcpy.AddMessage("Rasters folder {0} created".format(layers_name))
  
  
  def fgdb_schema(workspace, schema, dem):
      """Create file geodatabase using XML
      schema and set coordinate system based
      on input DEM if it doesn't already exist"""
      model_name = Path(workspace).name
      fgdb = "{0}.gdb".format(model_name)
      if arcpy.Exists(str(Path(workspace, fgdb))):
          arcpy.AddMessage("{0} file geodatabase exists".format(fgdb))
      else:
          new_fgdb = arcpy.CreateFileGDB_management(str(workspace), fgdb)
          import_type = "SCHEMA_ONLY"
          config_keyword = "DEFAULTS"
          arcpy.AddMessage("New {0} file geodatabase created".format(fgdb))
          arcpy.ImportXMLWorkspaceDocument_management(new_fgdb, schema,
                                                      import_type,
                                                      config_keyword)
          arcpy.AddMessage("ArcHydro schema imported")
          projection = arcpy.Describe(dem).spatialReference
          projection_name = projection.PCSName
          feature_dataset = Path(workspace, fgdb, "Layers")
          arcpy.DefineProjection_management(str(feature_dataset),
                                            projection)
          arcpy.AddMessage("Changed projection to {0}".format(projection_name))
  
  
  def model_schema(workspace, schema, dem):
      """Create model schema: rasters folder
      and file geodatabase"""
      rasters_directory(workspace)
      fgdb_schema(schema, dem, workspace)
  
  
  if __name__ == '__main__':
      parser = argparse.ArgumentParser(description='Create a ArcHydro schema')
      parser.add_argument('--workspace', metavar='path', required=True,
                          help='the path to workspace')
      parser.add_argument('--schema', metavar='path', required=True,
                          help='path to schema')
      parser.add_argument('--dem', metavar='path', required=True,
                          help='path to dem')
      args = parser.parse_args()
      model_schema(workspace=args.workspace, schema=args.schema, dem=args.dem)
  </code></pre>