{"id":1610,"date":"2011-08-05T12:08:01","date_gmt":"2011-08-05T12:08:01","guid":{"rendered":"https:\/\/supportex.net\/?p=1610"},"modified":"2019-05-10T20:10:58","modified_gmt":"2019-05-10T18:10:58","slug":"python-distribution-systems-world","status":"publish","type":"post","link":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/","title":{"rendered":"Python: distribution systems world"},"content":{"rendered":"<p>At the very beginning Python packaging world may seem too confusing. But only at first sight.<\/p>\n<p>There are a lot of different packages package <em>formats<\/em>, <em>libraries<\/em> and <em>tools<\/em> for distributing and \u00a0packages management in Python world. There is also <strong><a href=\"http:\/\/pypi.python.org\/\">PyPI<\/a><\/strong> <span style=\"font-family: 'Courier New', monospace; font-size: x-small;\">&#8211;<\/span> the Python Package Index is a repository of software for the Python.<\/p>\n<p>Most often used <em>formats<\/em> are <strong>tarbolls<\/strong> (tar.gz or zip files), <strong>eggs<\/strong> and <strong>system packages<\/strong> (like rpm, deb or other). Tarbolls are just source files archives. rpm or deb are binary files built with some system tools like rpmbuild. Eggs can \u00a0be thought of as a kind of zipped source code with some meta information (for instance, dependencies).<\/p>\n<p>There are also various <em>libraries<\/em>: <strong>distutils<\/strong>,<strong> setuptools<\/strong>, <strong> distribute <\/strong>and<strong> zc.buildout.<\/strong><a href=\"http:\/\/docs.python.org\/distutils\/index.html\"><br \/>\n<\/a><\/p>\n<p><a href=\"http:\/\/docs.python.org\/distutils\/index.html\"> <strong>distutils<\/strong><\/a><\/p>\n<p>It&#8217;s a built-in library. To distribute package developer need to write simple <em>setup.py<\/em> file which will be used to built your package in various formats. \u00a0It&#8217;s definitely lacks some features but clean and easy to use.<br \/>\nSimple example of setup.py:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from distutils.core import setup\nsetup(name='foo',\nversion='1.0',\npy_modules=['foo'],\n)<\/pre>\n<p>For instance, building RPM:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">python setup.py bdist_rpm<\/code><\/p>\n<p>That is all.<\/p>\n<p><strong><a href=\"http:\/\/peak.telecommunity.com\/DevCenter\/setuptools\">setuptools<\/a><\/strong><\/p>\n<p>It is a third-party software based on <em>distutils<\/em>. <em>setuptools<\/em> was created to make Python packaging more powerful then it was\u00a0 possible with <em>distutils<\/em> (for instance, dealing with dependencies).<\/p>\n<p>Basic example of setup.py:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from setuptools import setup, find_packages setup( name = \"HelloWorld\", version = \"0.1\", packages = find_packages(), )<\/pre>\n<p>Like <em>distutils,<\/em> <em>setuptools<\/em> supports different formats (bdist_rpm, bdist_wininst, etc.). For a long time, <em>setuptools<\/em> was widely used as one of the most popular packaging system. \u00a0For instance, <a href=\"http:\/\/github.com\/andymccurdy\/redis-py\">redis-py<\/a> by Andy McCurdy <a href=\"http:\/\/supportex.net\/blog\/2011\/07\/rpm-bulding-python-package-redis\/\">uses<\/a> <em>setuptools<\/em> and many others do.<\/p>\n<p><strong><a href=\"http:\/\/packages.python.org\/distribute\">distribute<\/a><\/strong><\/p>\n<p>It&#8217;s also a third-patty library and a fork of <em>setuptools<\/em>. \u00a0It was born after <em>setuptools<\/em> was not maintained for a long time. The main goal of <em>distribute<\/em> is &#8216;to replace <em>setuptools<\/em> as the standard method for working with Python module distributions.&#8217; \u00a0It supports both Python 2 and Python 3. \u00a0<em>distribute<\/em> is developing in two branches: 0.6.x (provides a setuptools-0.6cX compatible version and also fixes a lot of bugs which were not fixed in <em>setuptools<\/em>) \u00a0and 0.7.x (will be refactored version with a lot of <a href=\"http:\/\/packages.python.org\/distribute\/roadmap.html\">changes<\/a>).<\/p>\n<p><strong><a href=\"http:\/\/www.buildout.org\/\">zc.buildbot<\/a> <\/strong><\/p>\n<p>Project was started by Jim Fulton in 2006 \u00a0and is based on <em>setuptools<\/em> and <em>easy_install<\/em>. It is possibly more complicated then others building systems but it&#8217;s also more ambitious. \u00a0<em>Buildbot<\/em> uses additional configurations files (e.g., boostrap.py, \u00a0 bootstrap.cfg). It&#8217;s Python-based and works with eggs. <em>Buildbot<\/em> also introduces concept of <em>recipes <\/em><span style=\"font-family: 'Courier New', monospace;\"><span style=\"font-size: x-small;\">&#8211; <\/span><\/span>plugins which aim to add new functionalities to software building, like it&#8217;s <a href=\"http:\/\/www.buildout.org\/docs\/recipelist.html\">stated<\/a> in official documentation. \u00a0Recipes\u00a0 can installed from PyPI. \u00a0It allows <em>zc.buildbot<\/em> to extend possibilities since recipes can be used for different things, like <a href=\"http:\/\/pypi.python.org\/pypi\/tl.buildout_apache\/0.2\">setting up Apache<\/a> or <a href=\"http:\/\/pypi.python.org\/pypi\/z3c.recipe.usercrontab\/1.0\">managing Cron tasks<\/a> and so on. It&#8217;s also <a href=\"http:\/\/pypi.python.org\/pypi\/gp.recipe.pip\">possible<\/a> to use <em>pip<\/em> with <em>buildbot<\/em>.<\/p>\n<p>And finally, <em>packages management tools<\/em>: <strong>easy_install <\/strong>and <strong>pip<\/strong>.<\/p>\n<p><a href=\"http:\/\/peak.telecommunity.com\/DevCenter\/EasyInstallSimple\"><strong>easy_install<\/strong><\/a><\/p>\n<p>It is a part of <em>setuptools<\/em> and is a package manager. It&#8217;s really easy to install packages with it. It allows to download, build, install, and manage Python packages. It can also be used for installing packages in form of Eggs and packages from PyPI. <em>easy_install <\/em>was a main tool for installing third-party packages before <em>pip<\/em> was developed. On the dark side, it can&#8217;t be used for packages uninstalling. <em>easy_install<\/em> will be deprecated in 0.7.x of <em>distribute<\/em>.<\/p>\n<p>Here is an example if package installation with <em>easy_install<\/em>:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">easy_install install foobar<\/code><\/p>\n<p><strong><a href=\"http:\/\/pypi.python.org\/pypi\/pip\">pip<\/a><\/strong><\/p>\n<p>It&#8217;s a tool for Python packages management created by Ian Bicking. Primary it&#8217;s used for installing and management packages from PyPI. <em>Pip<\/em> is intended to replace<em> easy_install<\/em> and contains extra features (e.g., unlikely <em>easy_install<\/em> it can be used for uninstalling ). <span style=\"font-family: &amp;amp;\">It can not be used for installing eggs but it seems <a href=\"http:\/\/www.b-list.org\/weblog\/2008\/dec\/14\/packaging\/\">it is not really a problem<\/a>. <em>pip<\/em> uses <em>setuptools<\/em> or <em>distribute<\/em>. <em>pip<\/em> will be automatically installed into each virtual environment created with <em>virtualenv<\/em>.<\/span><\/p>\n<p><span style=\"font-family: &amp;amp;\">Example of package installation with <em>pip<\/em>: <\/span><\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">pip install foobar<\/code><\/p>\n<p>One more important tool you should know about is a\u00a0<a href=\"http:\/\/pypi.python.org\/pypi\/virtualenv\">virtualenv<\/a>. It&#8217;s widely used for creating <span style=\"font-family: &amp;amp;\">isolated Python environments which can be useful in both production and development. We will cover it later.<\/span><\/p>\n<p><span style=\"font-family: &amp;amp;\">At the time of writing (Aug 2011), \u00a0the most preferable way to install packages is <em>pip<\/em>. And <em>distribute<\/em> is for packaging. <em>easy_install<\/em> and <em>setuptool<\/em> can be considered as deprecated.<\/span><\/p>\n<p><span style=\"font-family: &amp;amp;\">Now you can easily understand what co-creator of Django <a href=\"http:\/\/jacobian.org\/writing\/nobody-expects-python-packaging\/\">Jacob Kaplan-Moss meant<\/a>:<\/span><\/p>\n<blockquote><p>Python has one package distribution system: source files and setup.py install.<br \/>\nAnd easy_install.<br \/>\nPython has two package distribution systems: setup.py install and easy_install. And zc.buildout.<br \/>\nPython has three package distribution systems: setup.py install, easy_install, and zc.buildout. And pip.<br \/>\nAmongst Python\u2019s package distribution are such diverse elements as\u2026<\/p><\/blockquote>\n<h2>Future reading<\/h2>\n<ol>\n<li><a href=\"http:\/\/www.b-list.org\/weblog\/2008\/dec\/14\/packaging\/ \">On packaging<\/a>, <a href=\"http:\/\/www.b-list.org\/weblog\/2008\/dec\/15\/pip\/\">Why I like pip<\/a>, both by James Bennett, Django release manager<\/li>\n<li><a href=\"http:\/\/diveintopython3.org\/packaging.html\">Chapter 16. Packaging Python Libraries<\/a> from <a href=\"http:\/\/diveintopython3.org\/\">Dive Into Python 3<\/a> by Mark Pilgrim<\/li>\n<li><a href=\"http:\/\/mrtopf.de\/blog\/en\/a-small-introduction-to-python-eggs\/\">A small introduction to Python Eggs <\/a>by by Christian Scholz<\/li>\n<li><a href=\"http:\/\/www.protocolostomy.com\/page\/2\/\">Python Packaging, Distribution, and Deployment: Volume 1<\/a><\/li>\n<li><a href=\"http:\/\/blog.ianbicking.org\/2008\/12\/14\/a-few-corrections-to-on-packaging\/\">A Few Corrections To \u201cOn Packaging\u201d<\/a> by Ian Bicking<\/li>\n<li><a href=\"http:\/\/faassen.n--tree.net\/blog\/view\/weblog\/2009\/11\/09\/0\">A history of Python packaging<\/a> by Martijn Faassen<\/li>\n<li><a href=\"http:\/\/jacobian.org\/writing\/django-apps-with-buildout\/\">Developing Django apps with zc.buildout<\/a> by Jacob Kaplan-Moss<\/li>\n<li><a href=\"http:\/\/www.aosabook.org\/en\/packaging.html\">Chapter 14. Python Packaging<\/a> by\u00a0Tarek Ziad\u00e9<\/li>\n<\/ol>\n<p><strong>Didn&#8217;t find the answer to your question? <a href=\"\/contacts\/\">Ask it<\/a> our administrators to reply we will publish on website.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>At the very beginning Python packaging world may seem too confusing. But only at first sight. There are a lot of different packages package formats, libraries and tools for distributing and \u00a0packages management in Python world. There is also PyPI &#8211; the Python Package Index is a repository of software for the Python. Most often&hellip; <\/p>\n<div class=\"readmore-wrapper\"><a href=\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/\" class=\"more-link\">Read <\/a><\/div>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[152],"tags":[275,217],"class_list":["post-1610","post","type-post","status-publish","format-standard","hentry","category-linux","tag-linux","tag-python-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Python: distribution systems world &#8211; Supportex.NET blog<\/title>\n<meta name=\"description\" content=\"How to build distribution Python systems world\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python: distribution systems world &#8211; Supportex.NET blog\" \/>\n<meta property=\"og:description\" content=\"How to build distribution Python systems world\" \/>\n<meta property=\"og:url\" content=\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/\" \/>\n<meta property=\"og:site_name\" content=\"Supportex.NET blog\" \/>\n<meta property=\"article:published_time\" content=\"2011-08-05T12:08:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-05-10T18:10:58+00:00\" \/>\n<meta name=\"author\" content=\"Oleksii Tykhonov\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oleksii Tykhonov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/\"},\"author\":{\"name\":\"Oleksii Tykhonov\",\"@id\":\"https:\/\/supportex.net\/blog\/en\/#\/schema\/person\/0690c26a0266603129fc15eae6243251\"},\"headline\":\"Python: distribution systems world\",\"datePublished\":\"2011-08-05T12:08:01+00:00\",\"dateModified\":\"2019-05-10T18:10:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/\"},\"wordCount\":863,\"commentCount\":0,\"keywords\":[\"linux\",\"python\"],\"articleSection\":[\"linux\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/\",\"url\":\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/\",\"name\":\"Python: distribution systems world &#8211; Supportex.NET blog\",\"isPartOf\":{\"@id\":\"https:\/\/supportex.net\/blog\/en\/#website\"},\"datePublished\":\"2011-08-05T12:08:01+00:00\",\"dateModified\":\"2019-05-10T18:10:58+00:00\",\"author\":{\"@id\":\"https:\/\/supportex.net\/blog\/en\/#\/schema\/person\/0690c26a0266603129fc15eae6243251\"},\"description\":\"How to build distribution Python systems world\",\"breadcrumb\":{\"@id\":\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/supportex.net\/blog\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python: distribution systems world\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/supportex.net\/blog\/en\/#website\",\"url\":\"https:\/\/supportex.net\/blog\/en\/\",\"name\":\"Supportex.NET blog\",\"description\":\"Server and network management company\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/supportex.net\/blog\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/supportex.net\/blog\/en\/#\/schema\/person\/0690c26a0266603129fc15eae6243251\",\"name\":\"Oleksii Tykhonov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/supportex.net\/blog\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4fd5f58002717075c88963469b9babef?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4fd5f58002717075c88963469b9babef?s=96&d=mm&r=g\",\"caption\":\"Oleksii Tykhonov\"},\"url\":\"https:\/\/supportex.net\/blog\/author\/oleksiitykhonov\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Python: distribution systems world &#8211; Supportex.NET blog","description":"How to build distribution Python systems world","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:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/","og_locale":"en_US","og_type":"article","og_title":"Python: distribution systems world &#8211; Supportex.NET blog","og_description":"How to build distribution Python systems world","og_url":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/","og_site_name":"Supportex.NET blog","article_published_time":"2011-08-05T12:08:01+00:00","article_modified_time":"2019-05-10T18:10:58+00:00","author":"Oleksii Tykhonov","twitter_misc":{"Written by":"Oleksii Tykhonov","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/#article","isPartOf":{"@id":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/"},"author":{"name":"Oleksii Tykhonov","@id":"https:\/\/supportex.net\/blog\/en\/#\/schema\/person\/0690c26a0266603129fc15eae6243251"},"headline":"Python: distribution systems world","datePublished":"2011-08-05T12:08:01+00:00","dateModified":"2019-05-10T18:10:58+00:00","mainEntityOfPage":{"@id":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/"},"wordCount":863,"commentCount":0,"keywords":["linux","python"],"articleSection":["linux"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/","url":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/","name":"Python: distribution systems world &#8211; Supportex.NET blog","isPartOf":{"@id":"https:\/\/supportex.net\/blog\/en\/#website"},"datePublished":"2011-08-05T12:08:01+00:00","dateModified":"2019-05-10T18:10:58+00:00","author":{"@id":"https:\/\/supportex.net\/blog\/en\/#\/schema\/person\/0690c26a0266603129fc15eae6243251"},"description":"How to build distribution Python systems world","breadcrumb":{"@id":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/supportex.net\/blog\/2011\/08\/python-distribution-systems-world\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/supportex.net\/blog\/en\/"},{"@type":"ListItem","position":2,"name":"Python: distribution systems world"}]},{"@type":"WebSite","@id":"https:\/\/supportex.net\/blog\/en\/#website","url":"https:\/\/supportex.net\/blog\/en\/","name":"Supportex.NET blog","description":"Server and network management company","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/supportex.net\/blog\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/supportex.net\/blog\/en\/#\/schema\/person\/0690c26a0266603129fc15eae6243251","name":"Oleksii Tykhonov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/supportex.net\/blog\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4fd5f58002717075c88963469b9babef?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4fd5f58002717075c88963469b9babef?s=96&d=mm&r=g","caption":"Oleksii Tykhonov"},"url":"https:\/\/supportex.net\/blog\/author\/oleksiitykhonov\/"}]}},"_links":{"self":[{"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/posts\/1610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/comments?post=1610"}],"version-history":[{"count":3,"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/posts\/1610\/revisions"}],"predecessor-version":[{"id":3221,"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/posts\/1610\/revisions\/3221"}],"wp:attachment":[{"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/media?parent=1610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/categories?post=1610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/supportex.net\/blog\/wp-json\/wp\/v2\/tags?post=1610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}