Comment passer des arguments à la fonction principale au sein de module Python?
J'ai récemment commencé à en apprendre plus sur les Paquets Python et les Modules. Je suis actuellement occupé à la mise à jour des modules existants de sorte que peut être exécuté en tant que script ou importées en tant que module dans mon code. Je ne suis pas sûr de la façon de construire mes arguments d'entrée à l'intérieur de mon module et de les transmettre à la fonction main() dans mon module.
J'ai écrit mon main() fonction et l'a appelé en vertu de si __name__ == '__principaux__' passant les arguments d'entrée. Les entrées sont actuellement codé en dur pour montrer ce que je suis en train de réaliser. Toute aide à savoir comment construire correctement mon entrée arguments que l'utilisateur va passer, qui sera ensuite transmis à la fonction principale sera appréciée.
Comme je le disais, je suis d'essayer d'être en mesure d'utiliser ce qui suit comme un script lorsqu'elle est utilisée directement ou importés en tant que module dans mon code et l'exécuter à partir de là. Si je importer un module que j'appelle le main() fonction lors de l'importation? Est la structure suivante correcte dans comment j'ai écrit la suite? Tout conseil est le bienvenue.
'''
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")
Mise à jour: 17/03/13
Le suivant est mis à jour mon module Python basé sur Jonathan suggestions:
'''
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)
OriginalL'auteur Peter Wilson | 2017-03-12
Vous devez vous connecter pour publier un commentaire.
Cela semble correct pour moi, et oui si vous êtes à la recherche pour l'utiliser comme un module, vous importez principal. Cependant, il serait probablement préférable de lui donner un nom plus descriptif.
De préciser comment
__main__
et la fonctionmain()
œuvres. Lors de l'exécution d'un module, il aura un nom qui est stocké dans__name__
. Si vous exécutez le module autonome comme un script, il aura le nom__main__
. Si vous exécutez en tant que partie d'un module ie l'importer dans un autre module qu'il aura le nom du module.La fonction
main()
peut être n'importe quel nom que vous voulez, et qui ne serait pas nuire à votre programme. Il est communément nommémain
dans de petits scripts, mais ce n'est pas un nom particulièrement bien si elle fait partie d'un ensemble plus vaste du code.En termes de permettre à un utilisateur d'arguments d'entrée lors de l'exécution d'un script que j'allais le chercher dans l'aide de
argparse
oucliquez
Un exemple de la façon dont argparse serait de travailler.
non, vous pouvez l'appeler ce que vous voulez. J'ai mis à jour la réponse à inclure un peu plus en détail 🙂
Salut Jonathan, seriez-vous en mesure de me donner un exemple sur la façon de passer les arguments à l'aide de argparse à ma main() d'une fonction. La raison de la demande, c'est que j'appelle deux fonctions au sein de ma main() func qui utilisent l'argument de l'espace de travail.
J'ai mis à jour la réponse à inclure comment utiliser argparse.
Salut Jonathan, je ne peux pas vous remercier assez, vous avez été d'une grande aide. La suivante va nelp me beaucoup avec mon code d'aller de l'avant.
OriginalL'auteur Jonathan