{"id":2075002,"date":"2023-09-13T13:13:40","date_gmt":"2023-09-13T20:13:40","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2075002"},"modified":"2023-12-01T15:37:26","modified_gmt":"2023-12-01T23:37:26","slug":"distributing-geoprocessing-and-python-functionality","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality","title":{"rendered":"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients"},"author":345522,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[738191,37511],"tags":[42181,31181,24341,30981,24801],"industry":[],"product":[36561],"class_list":["post-2075002","blog","type-blog","status-publish","format-standard","hentry","category-developers","category-sharing-collaboration","tag-arcgis-pro","tag-arcpy","tag-python","tag-script-tools","tag-sharing","product-arcgis-pro"],"acf":{"authors":[{"ID":345522,"user_firstname":"Rachel","user_lastname":"Godinho","nickname":"rgodinho","user_nicename":"rgodinho","display_name":"Rachel Godinho","user_email":"rgodinho@esri.com","user_url":"","user_registered":"2023-09-08 12:56:37","user_description":"I am completing my MSc in Applied Geomatics at Acadia University. I spent the fall of 2023 as a Product Engineer Intern with the Python team. I have previous experience in the wildlife biology &amp; conservation field. When I am not working, you can find me skating at the local ice rink or watching Jeopardy!","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/12\/headshot-RG-2023-scaled-e1701457605294-213x200.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"},{"ID":122991,"user_firstname":"Hannes","user_lastname":"Ziegler","nickname":"hziegler","user_nicename":"hziegler","display_name":"Hannes Ziegler","user_email":"hziegler@esri.com","user_url":"","user_registered":"2020-10-30 20:06:29","user_description":"Hannes is a product engineer on the Python team. He has five years of experience streamlining spatial data analysis workflows in the public and private sectors, and has been with Esri since 2019, where he focuses on the design, evaluation, and documentation of new and existing Python functionality.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/10\/HannesZiegler2-465x465.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"Part 1 of 2: Learn how to build a geoprocessing module to distribute custom Python toolboxes integrated with ArcGIS Pro.","flexible_content":[{"acf_fc_layout":"image","image":{"ID":2086112,"id":2086112,"title":"AdobeStock_172016290.jpeg-jpgW1250","filename":"AdobeStock_172016290.jpeg-jpgW1250.png","filesize":689028,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\/adobestock_172016290-jpeg-jpgw1250","alt":"Two coworkers looking at laptop screen","author":"345522","description":"","caption":"\u00a9 2023 Adobe Stock. All rights reserved.","name":"adobestock_172016290-jpeg-jpgw1250","status":"inherit","uploaded_to":2075002,"date":"2023-09-27 21:10:33","modified":"2023-09-27 22:07:55","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1250,"height":644,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250.png","medium-width":464,"medium-height":239,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250.png","medium_large-width":768,"medium_large-height":396,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250.png","large-width":1250,"large-height":644,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250.png","1536x1536-width":1250,"1536x1536-height":644,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250.png","2048x2048-width":1250,"2048x2048-height":644,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250-826x426.png","card_image-width":826,"card_image-height":426,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_172016290.jpeg-jpgW1250.png","wide_image-width":1250,"wide_image-height":644}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>When you create a custom Python script or tool, you may want to share your hard work with your coworkers or clients. A common problem users face when sharing packages is that their script tools have dependencies on packages that are not in the default ArcGIS Pro Python distribution (arcgispro-py3). As a result, the script tool may not work in the receiver\u2019s Python environment, making it challenging to share the script tool with coworkers, clients, or the broader community. If you intend on sharing the script tool with others, you should always consider if it will work in the receivers Python environment.<\/p>\n<p>In this blog series, you will learn to package the scripts and tools as a geoprocessing module, and then distribute with Anaconda. Conda will take care of solving the dependencies of your package when it is installed into a user\u2019s Python environment.<\/p>\n<p>This is part one of a two-part blog series. In this blog article, you will learn how to create a geoprocessing module. The next blog article, <a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/building-a-package-for-public-distribution-with-anaconda\/\">Build a package for public distribution with Anaconda<\/a>, will explain how to distribute a geoprocessing module using Anaconda.<\/p>\n<p><small><strong>? Note:<\/strong><br \/>\nFor more in-depth information regarding geoprocessing modules, visit <a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/arcpy\/geoprocessing_and_python\/extending-geoprocessing-through-python-modules.htm\">Create geoprocessing modules<\/a>.<\/small><\/p>\n<p>&nbsp;<\/p>\n<p><strong>What is a geoprocessing module?<\/strong><\/p>\n<p>A geoprocessing module is a Python package extended with a package structure containing an esri folder.<\/p>\n<ul>\n<li>Custom toolboxes and Python toolboxes can be distributed as geoprocessing modules.<\/li>\n<li>Once a geoprocessing module is installed in a Python environment, you can access toolboxes in ArcGIS Pro, through the <strong>Geoprocessing<\/strong> pane and with arcpy.<\/li>\n<\/ul>\n<p>This framework for geoprocessing modules is explained below.<\/p>\n"},{"acf_fc_layout":"content","content":"<h3>Create a geoprocessing module<\/h3>\n"},{"acf_fc_layout":"image","image":{"ID":2085842,"id":2085842,"title":"AdobeStock_222792278.jpeg-jpgW1250","filename":"AdobeStock_222792278.jpeg-jpgW1250.png","filesize":264267,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\/adobestock_222792278-jpeg-jpgw1250","alt":"Packages on a conveyor belt.","author":"345522","description":"","caption":"Assembling and distributing geoprocessing modules is like assembling and distributing packages in real life. \u00a9 2023 Adobe Stock. All rights reserved.","name":"adobestock_222792278-jpeg-jpgw1250","status":"inherit","uploaded_to":2075002,"date":"2023-09-27 20:20:31","modified":"2023-09-27 22:08:06","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1250,"height":417,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250.png","medium-width":464,"medium-height":155,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250.png","medium_large-width":768,"medium_large-height":256,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250.png","large-width":1250,"large-height":417,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250.png","1536x1536-width":1250,"1536x1536-height":417,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250.png","2048x2048-width":1250,"2048x2048-height":417,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250-826x276.png","card_image-width":826,"card_image-height":276,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_222792278.jpeg-jpgW1250.png","wide_image-width":1250,"wide_image-height":417}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<p>In Tutorial 1, you will assemble a Python package called <code>parcel<\/code>. The parcel includes a <code>letter<\/code> (written code) enclosed in an <code>envelope<\/code> (module). To distribute the parcel, it will be placed in a <code>mailbox<\/code> (parent directory).<\/p>\n<p>In Tutorial 2, you will create a toolbox to open the parcel in ArcGIS Pro, add toolbox support files and reorganize the folder structure of the Python package, converting the Python module into a geoprocessing module.<\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"content","content":"<h3>Create a Python package<\/h3>\n"},{"acf_fc_layout":"content","content":"<p>For the Python package to be built and distributed, a specific directory structure must exist. A module must be stored in a directory, which must be housed within a parent directory.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>parent_directory\r\n\u2514\u2500\u2500package_directory\r\n     \u251c  __init__.py \r\n     \u2514  module.py<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>Here is the example directory you will be creating:<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>mailbox\r\n\u2514\u2500\u2500\u2500parcel\r\n     \u251c  __init__.py \r\n     \u2514  envelope.py<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p><small><strong>? Note:<\/strong><br \/>\nThroughout this process, \u00a0__pycache__\u00a0folders may appear in the directories. To simplify the folder structure diagrams, they are not shown here.<\/small><\/p>\n"},{"acf_fc_layout":"content","content":"<h2 style=\"text-align: center\">TUTORIAL 1: Assemble a Python package<\/h2>\n"},{"acf_fc_layout":"content","content":"<p><small>Estimated time to complete: 5 minutes<\/small><\/p>\n<p>In this tutorial, you will create a Python package named <code>parcel<\/code> that will contain a module called <code>envelope.py<\/code>. The parcel package will be housed in a parent directory, <code>mailbox<\/code>.<\/p>\n"},{"acf_fc_layout":"content","content":"<p><strong>1.<\/strong> Create envelope.py:<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<p><small>The following is the sample code for the <code>envelope.py<\/code> Python module: <\/small><\/p>\n","image_reference":false,"layout":"code_snippet","image_reference_figure":"","snippet":"import os\r\ndef letter():\r\n    return f'Greetings {os.getenv(\"username\")}'","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<p><strong>2.<\/strong> Recreate the following directory in your file explorer:<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>mailbox\r\n\u2514\u2500\u2500\u2500parcel\r\n     \u2514  envelope.py<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p><small><strong>? Note:<\/strong><br \/>\nUse Ctrl + Shift + N to create folders.<\/small><\/p>\n"},{"acf_fc_layout":"content","content":"<p><strong>3.<\/strong> Create __init__.py:<\/p>\n<p style=\"text-align: left\">For the <code>envelope.py<\/code> module to initialize and run specific code once it has been imported, it requires an <code>__init__.py<\/code> file. By using an <code>__init__.py<\/code> file, the <code>parcel<\/code> directory is treated as a package by Python.<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<p><small>The following is the sample code for <code>__init__.py<\/code> in parcel:<\/small><\/p>\n","image_reference":false,"layout":"code_snippet","image_reference_figure":"","snippet":"from parcel import envelope","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<p>The directory structure should now look like this:<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>mailbox\r\n\u2514\u2500\u2500\u2500parcel\r\n     \u251c  __init__.py \r\n     \u2514  envelope.py<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>With this directory structure, you can import the <code>envelope.py <\/code>module through <code>import parcel<\/code>, and you can run the <code>parcel.envelope.letter() <\/code>function.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2077282,"id":2077282,"title":"graphic1RG","filename":"graphic1RG.png","filesize":45189,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\/graphic1rg","alt":"A graphic to explain the Python package structure. An envelope holds a letter. A stamp is added to the envelope and is now considered a parcel. The parcel is placed in a mailbox.","author":"345522","description":"","caption":"In this tutorial, a Python package named parcel is created and it contains a module called envelope.py. The __init.py__ file acts as a stamp.  The parcel package is housed in a parent directory,  mailbox. Curious to see what the letter says? Continue reading! Graphic by Rachel Godinho.","name":"graphic1rg","status":"inherit","uploaded_to":2075002,"date":"2023-09-15 10:56:45","modified":"2023-09-15 21:15:35","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1280,"height":720,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG.png","medium-width":464,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG.png","medium_large-width":768,"medium_large-height":432,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG.png","large-width":1280,"large-height":720,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG.png","1536x1536-width":1280,"1536x1536-height":720,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG.png","2048x2048-width":1280,"2048x2048-height":720,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG-826x465.png","card_image-width":826,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/graphic1RG.png","wide_image-width":1280,"wide_image-height":720}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>You have successfully created a Python package.<\/p>\n"},{"acf_fc_layout":"content","content":"<h3>Extend a Python package with geoprocessing tools<\/h3>\n"},{"acf_fc_layout":"content","content":"<p>Now that we have created the Python package parcel, you can extend it to have geoprocessing functionality. By adding an <code>esri<\/code> folder and reorganizing the package\u2019s folder structure, you extend the package in a way that ArcGIS Pro understands, making it possible to distribute custom toolboxes to other ArcGIS users.<\/p>\n<p>The standard directory structure for the Python package extended with custom geoprocessing functionality is the following:<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>mailbox\r\n\u2514\u2500\u2500parcel\r\n    \u251c  __init__.py \r\n    \u251c  envelope.py\r\n    \u2514\u2500\u2500esri\r\n        \u251c\u2500\u2500arcpy\r\n        \u251c\u2500\u2500help\r\n        \u2502   \u2514\u2500\u2500gp\r\n        \u2502       \u251c\u2500\u2500messages\r\n        \u2502       \u2514\u2500\u2500toolboxes\r\n        \u2514\u2500\u2500toolboxes<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>You will create this extended folder structure in Tutorial 2 below.<\/p>\n"},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<h2 style=\"text-align: center\">TUTORIAL 2: Convert a Python module to a geoprocessing module<\/h2>\n"},{"acf_fc_layout":"content","content":"<p><small>Estimated time to complete: 15 minutes<\/small><\/p>\n"},{"acf_fc_layout":"content","content":"<p><strong>1.<\/strong> Create a Python toolbox:<\/p>\n"},{"acf_fc_layout":"content","content":"<p>To demonstrate the process of extending geoprocessing through Python packages, create a Python toolbox named \u201cOpenYourEnvelope.pyt\u201d. <a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/arcpy\/geoprocessing_and_python\/creating-a-new-python-toolbox.htm\">Learn more about creating a Python toolbox.<\/a><\/p>\n"},{"acf_fc_layout":"sidebar","content":"<p><small>The following is the sample code to create a Python toolbox OpenYourEnvelope.pyt:<\/small><\/p>\n","image_reference":false,"layout":"code_snippet","image_reference_figure":"","snippet":"# -*- coding: utf-8 -*-\r\n\r\nimport arcpy\r\nimport os\r\nimport parcel\r\n\r\nclass Toolbox(object):\r\n    def __init__(self):\r\n        \"\"\"Define the toolbox (the name of the toolbox is the name of the\r\n        .pyt file).\"\"\"\r\n        self.label = \"Open Your Envelope Toolbox\"\r\n        self.alias = \"OpenYourEnvelopeToolbox\"\r\n\r\n        # List of tool classes associated with this toolbox\r\n        self.tools = [Tool]\r\n\r\nclass Tool(object):\r\n    def __init__(self):\r\n        \"\"\"Define the tool (tool name is the name of the class).\"\"\"\r\n        self.label = \"Read Your Letter\"\r\n        self.description = \"\"\r\n        self.canRunInBackground = False\r\n\r\n    def getParameterInfo(self):\r\n        \"\"\"Define parameter definitions\"\"\"\r\n        parameters=[arcpy.Parameter(displayName='Msg', \r\n                                  name='msg',\r\n                                  datatype='GPString',\r\n                                  parameterType='Derived',\r\n                                  direction='Output')\r\n                                  ]\r\n        return parameters\r\n\r\n    def isLicensed(self):\r\n        \"\"\"Set whether tool is licensed to execute.\"\"\"\r\n        return True\r\n\r\n    def updateParameters(self, parameters):\r\n        \"\"\"Modify the values and properties of parameters before internal\r\n        validation is performed.  This method is called whenever a parameter\r\n        has been changed.\"\"\"\r\n        return\r\n\r\n    def updateMessages(self, parameters):\r\n        \"\"\"Modify the messages created by internal validation for each tool\r\n        parameter.  This method is called after internal validation.\"\"\"\r\n        return\r\n\r\n    def execute(self, parameters, messages):\r\n        \"\"\"The source code of the tool.\"\"\"\r\n        result = parcel.envelope.letter()\r\n        messages.AddMessage(f\"You have mail \u2709 \\n\\n{result} Congrats on getting this far!\")\r\n        parameters[0].value = result\r\n        return \r\n","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<h3>Testing your toolbox<\/h3>\n"},{"acf_fc_layout":"content","content":"<p>Temporarily place OpenYourEnvelope.pyt into the root <code>mailbox<\/code> folder. Since <code>parcel<\/code> is being imported in the toolbox, the tool will likely not run properly unless it is in the same directory as the <code>parcel<\/code> package.<\/p>\n<p><strong>i.<\/strong> Open ArcGIS.<\/p>\n<p><strong>ii.<\/strong> Open the <strong>Catalog<\/strong> pane.<\/p>\n<p><strong>iii.<\/strong> Right-click folders and select <strong>Add Folder Connection<\/strong>.<\/p>\n<p><strong>iv.<\/strong> Select the <code>mailbox<\/code> folder.<\/p>\n<p><strong>v.<\/strong> Find the Read Your Letter Tool, double-click on it, and run the tool.<\/p>\n<p><strong>vi.<\/strong> Click <strong>View Details<\/strong>.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2077622,"id":2077622,"title":"Result","filename":"Result.png","filesize":250990,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\/result-5","alt":"Screenshot of details message on ArcGIS Pro as a result of running the OpenYourEnvelope tool. Message says: You've got mail. Greetings rac13593, congrats on getting this far!","author":"345522","description":"","caption":"Result of running the OpenYourEnvelope Python Toolbox. In the OpenYourEnvelope.pyt toolbox, the parcel package is imported and the execute method of the Tool class calls the letter()\u202f function from the envelope module.","name":"result-5","status":"inherit","uploaded_to":2075002,"date":"2023-09-15 13:45:10","modified":"2023-11-30 23:09:24","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":624,"height":351,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result.png","medium-width":464,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result.png","medium_large-width":624,"medium_large-height":351,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result.png","large-width":624,"large-height":351,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result.png","1536x1536-width":624,"1536x1536-height":351,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result.png","2048x2048-width":624,"2048x2048-height":351,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result.png","card_image-width":624,"card_image-height":351,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/Result.png","wide_image-width":624,"wide_image-height":351}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>In the <code>OpenYourEnvelope.pyt<\/code> toolbox, the parcel package is imported and the method of the Tool class calls the <code>letter()<\/code>\u202f function from the envelope module.<\/p>\n"},{"acf_fc_layout":"content","content":"<p>Once the <code>OpenYourEnvelope.pyt<\/code> toolbox has been created, the parameter help can be configured for the toolbox through the metadata. To edit a tool&#8217;s metadata, from the <strong>Catalog<\/strong> pane, right-click the tool in the toolbox and choose <strong>Edit Metadata<\/strong>.<\/p>\n"},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<p><strong>2.<\/strong> Create toolbox support files:<\/p>\n"},{"acf_fc_layout":"content","content":"<p>After the metadata is updated for the tool and toolbox, the <code>arcpy.gp.createtoolboxsupportfiles<\/code> function can be run to generate the supporting .xml files found in the <code>esri<\/code> folder structure described above. This command also produces <code>OpenYourEnvelope.py<\/code>, named after the tool, which allows the toolbox to be accessible from arcpy.<\/p>\n<p>If it isn&#8217;t there already, place <code>OpenYourEnvelope.pyt<\/code> into the root <code>mailbox<\/code> folder, and use the Python Command Prompt to run the following:<\/p>\n"},{"acf_fc_layout":"sidebar","content":"","image_reference":false,"layout":"code_snippet","image_reference_figure":"","snippet":"python -c \"import arcpy; arcpy.gp.createtoolboxsupportfiles(r'&lt;path\\to\\toolbox&gt;')\" ","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<p><small><strong>? Note:<\/strong><br \/>\nEnsure that the toolbox has an alias before running <code>arcpy.gp.createtoolboxsupportfiles<\/code>. The alias is needed to generate the help files.<\/small><\/p>\n"},{"acf_fc_layout":"content","content":"<p>In the resulting <code>esri<\/code> folder, create a <code>toolboxes<\/code> folder and move <code>OpenYourEnvelope.pyt<\/code> into it. The accompanying metadata (<code>.pyt.xml<\/code>) files can be discarded. The <code>esri<\/code> folder should now look like the following:<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>esri\r\n \u251c\u2500\u2500arcpy\r\n \u2502   \u2514  OpenYourEnvelope.py\r\n \u251c\u2500\u2500help\r\n \u2502   \u2514\u2500\u2500gp\r\n \u2502       \u251c  Tool_OpenYourEnvelopeToolbox.xml\r\n \u2502       \u251c  OpenYourEnvelopeToolbox_toolbox.xml\r\n \u2502       \u251c\u2500\u2500messages \r\n \u2502       \u2514\u2500\u2500toolboxes\r\n \u2502           \u2514  OpenYourEnvelope.xml\r\n \u2514\u2500\u2500toolboxes\r\n     \u2514  OpenYourEnvelope.pyt<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p><small><strong>? Note:<\/strong><br \/>\nThe messages folder is not generated by <code>arcpy.gp.createtoolboxsupportfiles<\/code>; it must be created manually to make messages used in the script tools or Python toolboxes localizable, but can be omitted if there is no plan to internalize your toolbox. To learn more, see <a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/latest\/arcpy\/geoprocessing_and_python\/international-language-support.htm\">Internationalization of geoprocessing modules<\/a>.<\/small><\/p>\n"},{"acf_fc_layout":"content","content":"<p>Move the <code>esri<\/code> folder into the <code>mailbox\\parcel<\/code> directory. The directory structure for the distribution will now be as follows:<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>mailbox\r\n\u2514\u2500\u2500parcel\r\n    \u251c  __init__.py \r\n    \u251c  envelope.py\r\n    \u2514\u2500\u2500esri\r\n        \u251c\u2500\u2500arcpy\r\n        \u2502   \u2514  OpenYourEnvelope.py\r\n        \u251c\u2500\u2500help\r\n        \u2502   \u2514\u2500\u2500gp\r\n        \u2502       \u251c  OpenYourEnvelope_toolbox.xml\r\n        \u2502       \u251c  Tool_OpenYourEnvelopeToolbox.xml\r\n        \u2502       \u251c\u2500\u2500messages\r\n        \u2502       \u2514\u2500\u2500toolboxes\r\n        \u2502           \u2514  OpenYourEnvelopeToolbox.xml\r\n        \u2514\u2500\u2500toolboxes\r\n            \u2514  OpenYourEnvelope.pyt<\/code><\/pre>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"content","content":"<p><strong>The geoprocessing module is ready to deliver. ? ?<\/strong><\/p>\n<p>To learn how to distribute the geoprocessing modules to your coworkers with Python dependencies intact, see part 2: <a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/building-a-package-for-public-distribution-with-anaconda\/\">Build a package for public distribution with Anaconda<\/a>.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2085922,"id":2085922,"title":"ezgif.com-reverse (1)","filename":"ezgif.com-reverse-1.gif","filesize":4547951,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1.gif","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\/ezgif-com-reverse-1","alt":"Man unloading package from a delivery truck.","author":"345522","description":"","caption":"","name":"ezgif-com-reverse-1","status":"inherit","uploaded_to":2075002,"date":"2023-09-27 20:37:13","modified":"2023-09-27 20:37:59","menu_order":0,"mime_type":"image\/gif","type":"image","subtype":"gif","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":600,"height":316,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1-213x200.gif","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1.gif","medium-width":464,"medium-height":244,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1.gif","medium_large-width":600,"medium_large-height":316,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1.gif","large-width":600,"large-height":316,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1.gif","1536x1536-width":600,"1536x1536-height":316,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1.gif","2048x2048-width":600,"2048x2048-height":316,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1.gif","card_image-width":600,"card_image-height":316,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/ezgif.com-reverse-1.gif","wide_image-width":600,"wide_image-height":316}},"image_position":"left-center","orientation":"horizontal","hyperlink":""}],"related_articles":"","card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_78591700copyrs2.jpg","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_78591700copyrs.jpg"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-01T23:37:26+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\"},\"author\":{\"name\":\"Rachel Godinho\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/c86f1eed3d96db307fa5bfa2004c97c5\"},\"headline\":\"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients\",\"datePublished\":\"2023-09-13T20:13:40+00:00\",\"dateModified\":\"2023-12-01T23:37:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\"},\"wordCount\":14,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"ArcGIS Pro\",\"ArcPy\",\"python\",\"Script tools\",\"sharing\"],\"articleSection\":[\"Developers\",\"Sharing and Collaboration\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\",\"name\":\"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2023-09-13T20:13:40+00:00\",\"dateModified\":\"2023-12-01T23:37:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/c86f1eed3d96db307fa5bfa2004c97c5\",\"name\":\"Rachel Godinho\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/12\/headshot-RG-2023-scaled-e1701457605294-213x200.jpg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/12\/headshot-RG-2023-scaled-e1701457605294-213x200.jpg\",\"caption\":\"Rachel Godinho\"},\"description\":\"I am completing my MSc in Applied Geomatics at Acadia University. I spent the fall of 2023 as a Product Engineer Intern with the Python team. I have previous experience in the wildlife biology &amp; conservation field. When I am not working, you can find me skating at the local ice rink or watching Jeopardy!\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/rachel-godinho\/\"],\"url\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality","og_locale":"en_US","og_type":"article","og_title":"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2023-12-01T23:37:26+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality"},"author":{"name":"Rachel Godinho","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/c86f1eed3d96db307fa5bfa2004c97c5"},"headline":"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients","datePublished":"2023-09-13T20:13:40+00:00","dateModified":"2023-12-01T23:37:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality"},"wordCount":14,"commentCount":1,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["ArcGIS Pro","ArcPy","python","Script tools","sharing"],"articleSection":["Developers","Sharing and Collaboration"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality","name":"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2023-09-13T20:13:40+00:00","dateModified":"2023-12-01T23:37:26+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Sharing is caring: Distribute geoprocessing and Python functionality to your coworkers, colleagues and clients"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/c86f1eed3d96db307fa5bfa2004c97c5","name":"Rachel Godinho","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/12\/headshot-RG-2023-scaled-e1701457605294-213x200.jpg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/12\/headshot-RG-2023-scaled-e1701457605294-213x200.jpg","caption":"Rachel Godinho"},"description":"I am completing my MSc in Applied Geomatics at Acadia University. I spent the fall of 2023 as a Product Engineer Intern with the Python team. I have previous experience in the wildlife biology &amp; conservation field. When I am not working, you can find me skating at the local ice rink or watching Jeopardy!","sameAs":["https:\/\/www.linkedin.com\/in\/rachel-godinho\/"],"url":""}]}},"text_date":"September 13, 2023","author_name":"Multiple Authors","author_page":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/sharing-collaboration\/distributing-geoprocessing-and-python-functionality","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/09\/AdobeStock_78591700copyrs.jpg","primary_product":"ArcGIS Pro","tag_data":[{"term_id":42181,"name":"ArcGIS Pro","slug":"arcgis-pro","term_group":0,"term_taxonomy_id":42181,"taxonomy":"post_tag","description":"","parent":0,"count":325,"filter":"raw"},{"term_id":31181,"name":"ArcPy","slug":"arcpy","term_group":0,"term_taxonomy_id":31181,"taxonomy":"post_tag","description":"","parent":0,"count":32,"filter":"raw"},{"term_id":24341,"name":"python","slug":"python","term_group":0,"term_taxonomy_id":24341,"taxonomy":"post_tag","description":"","parent":0,"count":171,"filter":"raw"},{"term_id":30981,"name":"Script tools","slug":"script-tools","term_group":0,"term_taxonomy_id":30981,"taxonomy":"post_tag","description":"","parent":0,"count":5,"filter":"raw"},{"term_id":24801,"name":"sharing","slug":"sharing","term_group":0,"term_taxonomy_id":24801,"taxonomy":"post_tag","description":"","parent":0,"count":32,"filter":"raw"}],"category_data":[{"term_id":738191,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":738191,"taxonomy":"category","description":"","parent":0,"count":426,"filter":"raw"},{"term_id":37511,"name":"Sharing and Collaboration","slug":"sharing-collaboration","term_group":0,"term_taxonomy_id":37511,"taxonomy":"category","description":"","parent":0,"count":424,"filter":"raw"}],"product_data":[{"term_id":36561,"name":"ArcGIS Pro","slug":"arcgis-pro","term_group":0,"term_taxonomy_id":36561,"taxonomy":"product","description":"","parent":0,"count":2045,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=arcgis-pro","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2075002","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/345522"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2075002"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2075002\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2075002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2075002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2075002"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2075002"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2075002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}