{"id":255,"date":"2021-03-15T21:21:48","date_gmt":"2021-03-15T21:21:48","guid":{"rendered":"https:\/\/andrejacobs.org\/?p=255"},"modified":"2022-04-11T20:24:23","modified_gmt":"2022-04-11T20:24:23","slug":"100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments","status":"publish","type":"post","link":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/","title":{"rendered":"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments"},"content":{"rendered":"\n

Here is my Log book<\/a><\/p>\n

Setting up Python 3 on macOS<\/h2>\n

I recently clean installed my Mac to use Big Sur and with that I have not yet had a chance to install Python 3 and using virtual environments.<\/p>\n

Python 2.x is no longer being maintained, however macOS Big Sur still ships 2.7.x.<\/p>\n

$ python --version\nPython 2.7.16\n<\/code><\/pre>\n

Homebrew<\/h3>\n

I like to use Homebrew<\/a> as my package manager on macOS. See their website on the one line command to run to install brew<\/code>.<\/p>\n

Ensure brew is up to date<\/p>\n

$ brew doctor\n$ brew update\n$ brew upgrade\n<\/code><\/pre>\n

Manage multiple versions of Python with pyenv<\/h3>\n

One of the things you learn as a developer on the job is that it does not take long for your development machine to become cluttered with programming languages and tools and at some point you will hit a snag where different projects will require different version of tool chains and dependencies.<\/p>\n

Always use a version manager if you can.<\/strong> For example for Node.js I use nvm<\/code> (for more details see this blog post<\/a>)<\/p>\n

For Python I like to use pyenv<\/a><\/p>\n

Install pyenv<\/code>.<\/p>\n

$ brew install pyenv\n<\/code><\/pre>\n

\"\"<\/p>\n

Add pyenv<\/code> to your ~\/.zshrc<\/p>\n

$ echo -e 'if command -v pyenv 1>\/dev\/null 2>&1; then\\n  eval "$(pyenv init -)"\\nfi' >> ~\/.zshrc\n<\/code><\/pre>\n

(I will be adding mine to ~\/.ajzsh\/extras\/zshrc.ajzsh because I am using my own ajzsh<\/a>)<\/p>\n

Install the latest version of Python 3<\/h3>\n

To get the latest version number of Python, visit the downloads<\/a> page. At the time writing the latest version is 3.9.2 however pyenv is at 3.9.1<\/p>\n

To get the list of available Pythons that can be installed from pyenv<\/code>.<\/p>\n

$ pyenv install --list\n<\/code><\/pre>\n
$ pyenv install 3.9.2\n...\npython-build: definition not found: 3.9.2\n# Bummer! pyenv haven't added 3.9.2 yet. You could try\n# brew update && brew upgrade pyenv\n# but the latest pyenv has is 3.9.1\n\n$ pyenv install 3.9.1\n...\nInstalled Python-3.9.1 to \/Users\/andre\/.pyenv\/versions\/3.9.1\n\n$ pyenv version\nsystem (set by \/Users\/andre\/.pyenv\/version)\n<\/code><\/pre>\n

Set the default global version of Python to the latest version<\/p>\n

$ pyenv global 3.9.1\n$ pyenv version\n3.9.1 (set by \/Users\/andre\/.pyenv\/version)\n\n# You might have to relaunch the terminal session\n$ python --version\nPython 3.9.1\n<\/code><\/pre>\n

Upgrade pip (pip is THE package installer for python, at least for now 😝)<\/p>\n

$ pip install --upgrade pip\n...\nSuccessfully installed pip-21.0.1\n<\/code><\/pre>\n

Verify<\/p>\n

$ which python\n\/Users\/andre\/.pyenv\/shims\/python\n\n$ python --version\nPython 3.9.1\n\n$ pip --version\npip 21.0.1 from \/Users\/andre\/.pyenv\/versions\/3.9.1\/lib\/python3.9\/site-packages\/pip (python 3.9)\n<\/code><\/pre>\n

Create a new Python based project<\/h2>\n

Along with being able to have multiple versions of toolchains installed it is also important<\/strong> not to litter your development machine with dependencies directly. Meaning if you install 3rd party packages directly to your machine then sooner or later you will run into different projects depending on different versions of the packages.<\/p>\n

The solution is to use Virtual Environments<\/a>.<\/p>\n

I prefer to use the python build in venv<\/code>.<\/p>\n

# Create a new project\n$ mkdir my-new-project\n$ cd my-new-project\n\n# Install a virtual environment\n$ python3 -m venv .\/venv\n<\/code><\/pre>\n

Activate the virtual environment<\/strong><\/p>\n

You will need to do this every time you start a new terminal session.<\/p>\n

$ source venv\/bin\/activate\n(venv) ~\/...\/my-new-project\n<\/code><\/pre>\n

Installing 3rd party packages<\/h3>\n

I like to use click<\/a> when developing Python CLI apps. So in this example I will be installing click into the virtual environment.<\/p>\n

(venv)$ pip install click\n...\nSuccessfully installed click-7.1.2\nWARNING: You are using pip version 20.2.3; however, version 21.0.1 is available.\nYou should consider upgrading via the '\/Users\/andre\/temp\/my-new-project\/venv\/bin\/python3 -m pip install --upgrade pip' command.\n<\/code><\/pre>\n

Notice the warning about the pip version. Earlier we updated the global pip to the latest version but the virtual environment is out of date. This shows the power behind using virtual environments.<\/p>\n

What happens in the virtual environment stays in the virtual environment<\/strong> 🤫<\/p>\n

# Upgrade virtual environment pip\n(venv)$ python3 -m pip install --upgrade pip\nSuccessfully installed pip-21.0.1\n<\/code><\/pre>\n

To see the list of installed packages<\/p>\n

(venv)$ pip list\nPackage    Version\n---------- -------\nclick      7.1.2\npip        21.0.1\nsetuptools 49.2.1\n<\/code><\/pre>\n

requirements.txt<\/strong><\/p>\n

The common convention is to "freeze" the list of packages that your project depends on into a file called requirements.txt that will then make it easier for anybody else (or yourself on a different machine or the CI\/CD) to install all of the dependencies.<\/p>\n

To freeze the required packages<\/p>\n

(venv)$ pip freeze > requirements.txt\n(venv)$ cat requirements.txt\nclick==7.1.2\n<\/code><\/pre>\n

To install the required packages you would run<\/p>\n

(venv)$ python -m pip install -r requirements.txt\n<\/code><\/pre>\n

OpenFaaS and Python template<\/strong><\/p>\n

You will notice that when you used the Python template to create a new OpenFaaS function that it created an empty requirements.txt file. If my theory is correct then there will be some kind of command run during deployment \/ building that will do a similar install of requirements.txt as we did above.<\/p>\n

I am going to explore this theory a bit.<\/p>\n

\u256d ~\/Learning\/faasd\/helloworld\/helloworld\n\u2570 $ ls\n__init__.py       handler.py        requirements.txt\n\n$ cd ..\/\n$ grep -R 'requirements.txt' .\/\n...\n.\/\/template\/python3\/Dockerfile:COPY requirements.txt   .\n.\/\/template\/python3\/Dockerfile:RUN pip install -r requirements.txt --target=\/home\/app\/python\n<\/code><\/pre>\n

Right ok so the OpenFaaS template will indeed install any packages we use as long as we follow the convention of adding them to requirements.txt.<\/p>\n

Next theory, I bet the Flask based template<\/a> lists flask in the requirements.txt.<\/p>\n

(I thought the flask template was part of the standard OpenFaaS templates, but reading that git repo suggest you need to pull it in a different way than what I have been using so far. Will explore more tomorrow)<\/p>\n

\"\"<\/p>\n

Voila! Theory checked out correctly.<\/p>\n

Learning action point:<\/strong> What is waitress?<\/p>\n

So I am guessing I will be using venv to develop 90% of the function locally first and test it works and then "move" it across to be an OpenFaaS function. I will probably start of with the flask template first, then turn it into a PyCharm project to ensure I can make it work locally first.<\/p>\n

Time to go wrangle some snakes!<\/strong><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"

[…]<\/p>\n

Read more →<\/a><\/p>\n","protected":false},"author":2,"featured_media":254,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[37],"tags":[36,23],"yoast_head":"\n100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments - Andr\u00e9 Jacobs<\/title>\n<meta name=\"description\" content=\"Day 7 of 100 complete. Today I will show you how to install Python on your Mac using pyenv and virtual environments.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments - Andr\u00e9 Jacobs\" \/>\n<meta property=\"og:description\" content=\"Day 7 of 100 complete. Today I will show you how to install Python on your Mac using pyenv and virtual environments.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/\" \/>\n<meta property=\"og:site_name\" content=\"Andr\u00e9 Jacobs\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-15T21:21:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-04-11T20:24:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/andrejacobs.org\/wp-content\/uploads\/2021\/03\/python-logo-master-v3-TM.png\" \/>\n\t<meta property=\"og:image:width\" content=\"601\" \/>\n\t<meta property=\"og:image:height\" content=\"203\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Jacobs\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andrejacobs81\" \/>\n<meta name=\"twitter:site\" content=\"@andrejacobs81\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Jacobs\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/\"},\"author\":{\"name\":\"Andr\u00e9 Jacobs\",\"@id\":\"https:\/\/andrejacobs.org\/#\/schema\/person\/3d38360883015e883c80c2fb875c5a68\"},\"headline\":\"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments\",\"datePublished\":\"2021-03-15T21:21:48+00:00\",\"dateModified\":\"2022-04-11T20:24:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/\"},\"wordCount\":729,\"publisher\":{\"@id\":\"https:\/\/andrejacobs.org\/#\/schema\/person\/3d38360883015e883c80c2fb875c5a68\"},\"keywords\":[\"OpenFaaS\",\"Python\"],\"articleSection\":[\"100 Days Challenge\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/\",\"url\":\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/\",\"name\":\"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments - Andr\u00e9 Jacobs\",\"isPartOf\":{\"@id\":\"https:\/\/andrejacobs.org\/#website\"},\"datePublished\":\"2021-03-15T21:21:48+00:00\",\"dateModified\":\"2022-04-11T20:24:23+00:00\",\"description\":\"Day 7 of 100 complete. Today I will show you how to install Python on your Mac using pyenv and virtual environments.\",\"breadcrumb\":{\"@id\":\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/andrejacobs.org\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/andrejacobs.org\/#website\",\"url\":\"https:\/\/andrejacobs.org\/\",\"name\":\"Andr\u00e9 Jacobs\",\"description\":\"iOS Development, Electronics, Robotics, Artificial Intelligence, Business and Health\",\"publisher\":{\"@id\":\"https:\/\/andrejacobs.org\/#\/schema\/person\/3d38360883015e883c80c2fb875c5a68\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/andrejacobs.org\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/andrejacobs.org\/#\/schema\/person\/3d38360883015e883c80c2fb875c5a68\",\"name\":\"Andr\u00e9 Jacobs\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/andrejacobs.org\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/andrejacobs.org\/wp-content\/uploads\/2019\/03\/andre_jacobs.jpg\",\"contentUrl\":\"https:\/\/andrejacobs.org\/wp-content\/uploads\/2019\/03\/andre_jacobs.jpg\",\"width\":450,\"height\":450,\"caption\":\"Andr\u00e9 Jacobs\"},\"logo\":{\"@id\":\"https:\/\/andrejacobs.org\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/andrejacobs.org\",\"https:\/\/www.youtube.com\/channel\/UCzqXvnd_UJ3sAzQkQBD-IVw\"],\"url\":\"https:\/\/andrejacobs.org\/author\/andre\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments - Andr\u00e9 Jacobs","description":"Day 7 of 100 complete. Today I will show you how to install Python on your Mac using pyenv and virtual environments.","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:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/","og_locale":"en_GB","og_type":"article","og_title":"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments - Andr\u00e9 Jacobs","og_description":"Day 7 of 100 complete. Today I will show you how to install Python on your Mac using pyenv and virtual environments.","og_url":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/","og_site_name":"Andr\u00e9 Jacobs","article_published_time":"2021-03-15T21:21:48+00:00","article_modified_time":"2022-04-11T20:24:23+00:00","og_image":[{"width":601,"height":203,"url":"https:\/\/andrejacobs.org\/wp-content\/uploads\/2021\/03\/python-logo-master-v3-TM.png","type":"image\/png"}],"author":"Andr\u00e9 Jacobs","twitter_card":"summary_large_image","twitter_creator":"@andrejacobs81","twitter_site":"@andrejacobs81","twitter_misc":{"Written by":"Andr\u00e9 Jacobs","Estimated reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/#article","isPartOf":{"@id":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/"},"author":{"name":"Andr\u00e9 Jacobs","@id":"https:\/\/andrejacobs.org\/#\/schema\/person\/3d38360883015e883c80c2fb875c5a68"},"headline":"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments","datePublished":"2021-03-15T21:21:48+00:00","dateModified":"2022-04-11T20:24:23+00:00","mainEntityOfPage":{"@id":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/"},"wordCount":729,"publisher":{"@id":"https:\/\/andrejacobs.org\/#\/schema\/person\/3d38360883015e883c80c2fb875c5a68"},"keywords":["OpenFaaS","Python"],"articleSection":["100 Days Challenge"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/","url":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/","name":"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments - Andr\u00e9 Jacobs","isPartOf":{"@id":"https:\/\/andrejacobs.org\/#website"},"datePublished":"2021-03-15T21:21:48+00:00","dateModified":"2022-04-11T20:24:23+00:00","description":"Day 7 of 100 complete. Today I will show you how to install Python on your Mac using pyenv and virtual environments.","breadcrumb":{"@id":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/andrejacobs.org\/100-days-challenge\/100-days-of-learning-day-7-setting-up-python-using-pyenv-and-virtual-environments\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/andrejacobs.org\/"},{"@type":"ListItem","position":2,"name":"100 Days of Learning: Day 7 \u2013 Setting up Python using pyenv and virtual environments"}]},{"@type":"WebSite","@id":"https:\/\/andrejacobs.org\/#website","url":"https:\/\/andrejacobs.org\/","name":"Andr\u00e9 Jacobs","description":"iOS Development, Electronics, Robotics, Artificial Intelligence, Business and Health","publisher":{"@id":"https:\/\/andrejacobs.org\/#\/schema\/person\/3d38360883015e883c80c2fb875c5a68"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/andrejacobs.org\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/andrejacobs.org\/#\/schema\/person\/3d38360883015e883c80c2fb875c5a68","name":"Andr\u00e9 Jacobs","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/andrejacobs.org\/#\/schema\/person\/image\/","url":"https:\/\/andrejacobs.org\/wp-content\/uploads\/2019\/03\/andre_jacobs.jpg","contentUrl":"https:\/\/andrejacobs.org\/wp-content\/uploads\/2019\/03\/andre_jacobs.jpg","width":450,"height":450,"caption":"Andr\u00e9 Jacobs"},"logo":{"@id":"https:\/\/andrejacobs.org\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/andrejacobs.org","https:\/\/www.youtube.com\/channel\/UCzqXvnd_UJ3sAzQkQBD-IVw"],"url":"https:\/\/andrejacobs.org\/author\/andre\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/andrejacobs.org\/wp-content\/uploads\/2021\/03\/python-logo-master-v3-TM.png","_links":{"self":[{"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/posts\/255"}],"collection":[{"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/comments?post=255"}],"version-history":[{"count":1,"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/posts\/255\/revisions"}],"predecessor-version":[{"id":256,"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/posts\/255\/revisions\/256"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/media\/254"}],"wp:attachment":[{"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/media?parent=255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/categories?post=255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/andrejacobs.org\/wp-json\/wp\/v2\/tags?post=255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}