<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Multivalue parameter as text in .pyt - reading in to imported module function in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/multivalue-parameter-as-text-in-pyt-reading-in-to/m-p/677874#M52520</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I'm building a Python toolbox with a tool which calls specific functions from a custom module.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The main input parameter for this tool is a multivalue list of raster layers.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In the execute block of my tool, I use parameter[2].valueAsText to read in said parameter, as normal, and then feed it into a custom module function as follows:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;output&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[0].valueAsText input&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[2].valueAsText function&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[1].valueAsText functionname&amp;nbsp;&amp;nbsp;&amp;nbsp; = "Local" + function option&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[3].valueAsText expression&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[4].valueAsText&amp;nbsp; newGrid = getattr(localfuncs,functionname)(input,option,expression) newGrid.save(output)&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;In this case, I've tested it with one custom function (corresponding to 'functionname'):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;def LocalMean(input,option,expression): &amp;nbsp;&amp;nbsp;&amp;nbsp; import arcpy &amp;nbsp;&amp;nbsp;&amp;nbsp; newGrid = arcpy.sa.CellStatistics(input,"MEAN") &amp;nbsp;&amp;nbsp;&amp;nbsp; return newGrid&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;The trouble is that the 'input' (multivalue read in as text) ends up being a semicolon-delimited string of file names, and the function in the custom module can't seem to convert it back to a list of raster layers for Cell Statistics to actually process. As a result I get this error:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Script failed because:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERROR 000732: Input Raster: Dataset Development;Vegetation;Hydrology;Elevation does not exist or is not supported at this location: &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I've tried reading in 'input' with .values instead of .valueAsText, so it comes in as a list, but then I get the error that 'cannot concatenate 'str' and 'list' objects' in the getattr line.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any ideas what I can do about this?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I know this overall structure may seem unnecessarily complicated; but it's a key part of the bigger project. I'm not attached to specifically using getattr here, but solutions which preserve the basic structure, namely calling functions from a custom module using a string of the function's name, would be ideal. Thanks a lot!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 10 Jun 2014 15:55:17 GMT</pubDate>
    <dc:creator>Tse_YangLim</dc:creator>
    <dc:date>2014-06-10T15:55:17Z</dc:date>
    <item>
      <title>Multivalue parameter as text in .pyt - reading in to imported module function</title>
      <link>https://community.esri.com/t5/python-questions/multivalue-parameter-as-text-in-pyt-reading-in-to/m-p/677874#M52520</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I'm building a Python toolbox with a tool which calls specific functions from a custom module.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The main input parameter for this tool is a multivalue list of raster layers.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In the execute block of my tool, I use parameter[2].valueAsText to read in said parameter, as normal, and then feed it into a custom module function as follows:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;output&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[0].valueAsText input&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[2].valueAsText function&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[1].valueAsText functionname&amp;nbsp;&amp;nbsp;&amp;nbsp; = "Local" + function option&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[3].valueAsText expression&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = parameters[4].valueAsText&amp;nbsp; newGrid = getattr(localfuncs,functionname)(input,option,expression) newGrid.save(output)&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;In this case, I've tested it with one custom function (corresponding to 'functionname'):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;def LocalMean(input,option,expression): &amp;nbsp;&amp;nbsp;&amp;nbsp; import arcpy &amp;nbsp;&amp;nbsp;&amp;nbsp; newGrid = arcpy.sa.CellStatistics(input,"MEAN") &amp;nbsp;&amp;nbsp;&amp;nbsp; return newGrid&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;The trouble is that the 'input' (multivalue read in as text) ends up being a semicolon-delimited string of file names, and the function in the custom module can't seem to convert it back to a list of raster layers for Cell Statistics to actually process. As a result I get this error:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Script failed because:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERROR 000732: Input Raster: Dataset Development;Vegetation;Hydrology;Elevation does not exist or is not supported at this location: &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I've tried reading in 'input' with .values instead of .valueAsText, so it comes in as a list, but then I get the error that 'cannot concatenate 'str' and 'list' objects' in the getattr line.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any ideas what I can do about this?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I know this overall structure may seem unnecessarily complicated; but it's a key part of the bigger project. I'm not attached to specifically using getattr here, but solutions which preserve the basic structure, namely calling functions from a custom module using a string of the function's name, would be ideal. Thanks a lot!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 10 Jun 2014 15:55:17 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/multivalue-parameter-as-text-in-pyt-reading-in-to/m-p/677874#M52520</guid>
      <dc:creator>Tse_YangLim</dc:creator>
      <dc:date>2014-06-10T15:55:17Z</dc:date>
    </item>
    <item>
      <title>Re: Multivalue parameter as text in .pyt - reading in to imported module function</title>
      <link>https://community.esri.com/t5/python-questions/multivalue-parameter-as-text-in-pyt-reading-in-to/m-p/677875#M52521</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;You need to split the string by semicolon to produce the list:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;def LocalMean(input,option,expression): &amp;nbsp;&amp;nbsp;&amp;nbsp; import arcpy &amp;nbsp;&amp;nbsp;&amp;nbsp; newGrid = arcpy.sa.CellStatistics(input.split(';') ,"MEAN") &amp;nbsp;&amp;nbsp;&amp;nbsp; return newGrid&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;However, you may have issues with this because you are not getting the full paths to the data if you are using a raster layer parameter.&amp;nbsp; If this is the case you may want to add an extra parameter to grab the workspace of all rasters:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;def LocalMean(ws, input, option, expression): &amp;nbsp;&amp;nbsp;&amp;nbsp; import arcpy, os &amp;nbsp;&amp;nbsp;&amp;nbsp; rasters = [os.path.join(ws, r) for r in input.split(';')] &amp;nbsp;&amp;nbsp;&amp;nbsp; newGrid = arcpy.sa.CellStatistics(rasters ,"MEAN") &amp;nbsp;&amp;nbsp;&amp;nbsp; return newGrid&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have to write tons of script tools for work, so I wrote this function a while back to fix input paramters from script tools.&amp;nbsp;&amp;nbsp; People like to put spaces in path names too, so that can break the input string because extra quotes will be inserted in the semicolon delimited input list from multi-value types.&amp;nbsp; I usually pass arguments through this function before working with inputs in my script tools:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;def fixArgs(arg, arg_type=list): &amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;nbsp;&amp;nbsp;&amp;nbsp; fixes arguments from a script tool.&amp;nbsp; for example,&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; when using a script tool with a multivalue parameter, &amp;nbsp;&amp;nbsp;&amp;nbsp; it comes in as "val_a;val_b;val_c".&amp;nbsp; This function can &amp;nbsp;&amp;nbsp;&amp;nbsp; automatically fix arguments based on the arg_type.&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Another example is the boolean type returned from a &amp;nbsp;&amp;nbsp;&amp;nbsp; script tool.&amp;nbsp; Instead of True and False, it is returned as &amp;nbsp;&amp;nbsp;&amp;nbsp; "true" and "false"&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; arg:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; argument from script tool (arcpy.GetParameterAsText() or sys.argv[1]) (str) &amp;nbsp;&amp;nbsp;&amp;nbsp; arg_type: type to convert argument from script tool parameter&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # Example: &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt;&amp;gt; # example of list returned from script tool multiparameter argument &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt;&amp;gt; arg = "val_a;val_b;val_c" &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt;&amp;gt; fixArgs(arg, list) &amp;nbsp;&amp;nbsp;&amp;nbsp; ['val_a', 'val_b', 'val_c'] &amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;nbsp;&amp;nbsp;&amp;nbsp; if arg_type == list: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if isinstance(arg, str): &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # need to replace extra quotes for paths with spaces &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return map(lambda a: a.replace("'",""), arg.split(';')) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return list(arg) &amp;nbsp;&amp;nbsp;&amp;nbsp; if arg_type == float: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try': &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return float(arg) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; except: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0 &amp;nbsp;&amp;nbsp;&amp;nbsp; if arg_type == int: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return int(arg) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; except: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0 &amp;nbsp;&amp;nbsp;&amp;nbsp; if arg_type == bool: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if str(arg).lower() == 'true' or arg in [True, 1]: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return True &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return False &amp;nbsp;&amp;nbsp;&amp;nbsp; if arg_type == str: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if arg in [None, '', '#']: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return '' &amp;nbsp;&amp;nbsp;&amp;nbsp; return arg&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 10 Jun 2014 16:04:01 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/multivalue-parameter-as-text-in-pyt-reading-in-to/m-p/677875#M52521</guid>
      <dc:creator>Anonymous User</dc:creator>
      <dc:date>2014-06-10T16:04:01Z</dc:date>
    </item>
    <item>
      <title>Re: Multivalue parameter as text in .pyt - reading in to imported module function</title>
      <link>https://community.esri.com/t5/python-questions/multivalue-parameter-as-text-in-pyt-reading-in-to/m-p/677876#M52522</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;The semicolon split did the trick! Thanks a lot!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 11 Jun 2014 16:05:26 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/multivalue-parameter-as-text-in-pyt-reading-in-to/m-p/677876#M52522</guid>
      <dc:creator>Tse_YangLim</dc:creator>
      <dc:date>2014-06-11T16:05:26Z</dc:date>
    </item>
  </channel>
</rss>

