{"id":1625,"date":"2016-03-30T20:30:20","date_gmt":"2016-03-31T03:30:20","guid":{"rendered":"http:\/\/visualgdb.com\/w\/?p=1625"},"modified":"2016-03-30T20:30:20","modified_gmt":"2016-03-31T03:30:20","slug":"creating-python-interfaces-for-c-libraries-on-raspberry-pi","status":"publish","type":"post","link":"https:\/\/visualgdb.com\/tutorials\/raspberry\/python\/","title":{"rendered":"Creating Python interfaces for C libraries on Raspberry Pi"},"content":{"rendered":"<p>This tutorial shows how to interface a C library to a Python script on Raspberry Pi with VisualGDB. We will create a Python module exporting some basic functionality from the <a href=\"http:\/\/wiringpi.com\/\">wiringPi<\/a> library to the Python script and use it to control an LED connected to Raspberry Pi. Before you begin, install VisualGDB 5.1 or later.<\/p>\n<ol>\n<li>Our first step will be to install the debug build of Python to Raspberry Pi. Connect to your board via <a href=\"http:\/\/smartty.sysprogs.com\/\">SmarTTY<\/a> and run the following commands:\n<pre class=\"\">sudo apt-get update\r\nsudo apt-get install python3.3-dev python3.3-dbg<\/pre>\n<p><a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/00b-python3-dbg.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1627\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/00b-python3-dbg.png\" alt=\"00b-python3-dbg\" width=\"878\" height=\"441\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/00b-python3-dbg.png 878w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/00b-python3-dbg-300x151.png 300w\" sizes=\"(max-width: 878px) 100vw, 878px\" \/><\/a><\/li>\n<li>Then download, build and install the wiringPi library:\n<pre class=\"\">sudo apt-get install git-core\r\ngit clone git:\/\/git.drogon.net\/wiringPi\r\ncd wiringPi\r\n.\/build<\/pre>\n<p><a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/00a-build.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1626\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/00a-build.png\" alt=\"00a-build\" width=\"924\" height=\"412\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/00a-build.png 924w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/00a-build-300x134.png 300w\" sizes=\"(max-width: 924px) 100vw, 924px\" \/><\/a><\/li>\n<li>Now that both Python and wiringPi are installed on your Raspberry, we will create a Visual Studio project demonstrating how to export the wiringPi functionality to Python. Start Visual Studio and launch the VisualGDB Linux Project Wizard:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/01-projname.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1628\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/01-projname.png\" alt=\"01-projname\" width=\"786\" height=\"443\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/01-projname.png 786w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/01-projname-300x169.png 300w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/><\/a><\/li>\n<li>Select &#8220;Create a new project -&gt; Python-based project&#8221;:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/02-module.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1629\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/02-module.png\" alt=\"02-module\" width=\"789\" height=\"641\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/02-module.png 789w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/02-module-300x244.png 300w\" sizes=\"(max-width: 789px) 100vw, 789px\" \/><\/a><\/li>\n<li>Then select &#8220;Build the project locally with a cross-compiler&#8221;, pick the Raspberry Pi cross-toolchain (if it&#8217;s not installed, VisualGDB will download and install it automatically) and choose the connection to your Raspberry Pi (select &#8220;Create a new SSH connection&#8221; if it&#8217;s not in the list):<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/03-target1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1630\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/03-target1.png\" alt=\"03-target\" width=\"822\" height=\"642\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/03-target1.png 822w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/03-target1-300x234.png 300w\" sizes=\"(max-width: 822px) 100vw, 822px\" \/><\/a>Once you have selected the toolchain and the target, click &#8220;Synchronize headers and libraries&#8221;.<\/li>\n<li>Proceed with the default synchronization directories (if you only installed Python and wiringPi since last sync, you can uncheck the \/opt directory to save some time):<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/04-sync.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1631\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/04-sync.png\" alt=\"04-sync\" width=\"406\" height=\"354\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/04-sync.png 406w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/04-sync-300x262.png 300w\" sizes=\"(max-width: 406px) 100vw, 406px\" \/><\/a><\/li>\n<li>Finally select your python executable. Raspberry Pi uses slightly different naming for Python directories from the Desktop Linux, so you will need to select the include folder (e.g. \/usr\/include\/python3.3dm) manually. Note that as you are using the debug build, you need to pick a directory containing the &#8216;d&#8217; letter: <a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/06-python.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1632\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/06-python.png\" alt=\"06-python\" width=\"822\" height=\"642\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/06-python.png 822w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/06-python-300x234.png 300w\" sizes=\"(max-width: 822px) 100vw, 822px\" \/><\/a><\/li>\n<li>Press &#8220;Finish&#8221; to generate the project. Before we add any wiringPi-specific code, quickly test that the project can be built and debugged. Set a breakpoint inside HelloMethod() and hit F5 to start debugging:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/07-dbgc.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1633\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/07-dbgc.png\" alt=\"07-dbgc\" width=\"956\" height=\"676\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/07-dbgc.png 956w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/07-dbgc-300x212.png 300w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/li>\n<li>Once the breakpoint is triggered, use the Call Stack window to navigate to the &lt;module&gt; frame and verify that you can see the Python source as well:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/08-dbgpy.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1634\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/08-dbgpy.png\" alt=\"08-dbgpy\" width=\"956\" height=\"676\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/08-dbgpy.png 956w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/08-dbgpy-300x212.png 300w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/li>\n<li>Now we will add the wiringPi support. Include the &lt;wiringPi.h&gt; file and replace the HelloMethod() together with the method table with the following code:\n<pre class=\"\">template &lt;int _Value&gt; static PyObject *SetPin(PyObject *self, PyObject *args)\r\n{\r\n\u00a0\u00a0 \u00a0int pinNumber;\r\n\r\n\u00a0\u00a0 \u00a0if (!PyArg_ParseTuple(args, \"d\", &amp;pinNumber))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return Py_BuildValue(\"0\", 1);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 digitalWrite(pinNumber, _Value);\r\n\u00a0\u00a0 \u00a0return Py_BuildValue(\"i\", 1);\r\n}\r\n\r\ntemplate &lt;int _Value&gt; static PyObject *SetMode(PyObject *self, PyObject *args)\r\n{\r\n\u00a0\u00a0\u00a0 int pinNumber;\r\n\r\n\u00a0\u00a0\u00a0 if (!PyArg_ParseTuple(args, \"d\", &amp;pinNumber))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return Py_BuildValue(\"0\", 1);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 pinMode(pinNumber, _Value);\r\n\u00a0\u00a0\u00a0 return Py_BuildValue(\"i\", 1);\r\n}\r\n\r\nstatic PyMethodDef PythonWiringDemoMethods[] = \r\n{\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\"sethigh\",\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetPin&lt;HIGH&gt;,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0METH_VARARGS,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\"Sets an output pin value to HIGH\" \r\n\u00a0\u00a0 \u00a0},\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"setlow\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetPin&lt;LOW&gt;,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 METH_VARARGS,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Sets an output pin value to LOW\" \r\n\u00a0\u00a0\u00a0 },\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"makeoutput\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetMode&lt;OUTPUT&gt;,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 METH_VARARGS,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Configures a pin as output\" \r\n\u00a0\u00a0\u00a0 },\r\n\r\n{ NULL, NULL, 0, NULL }\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* End of list *\/\r\n};<\/pre>\n<p><a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/09-setpin.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1635\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/09-setpin.png\" alt=\"09-setpin\" width=\"956\" height=\"676\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/09-setpin.png 956w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/09-setpin-300x212.png 300w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/li>\n<li>Insert a call to wiringPiSetupGpio() to the module initialization function:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/gpio.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1643\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/gpio.png\" alt=\"gpio\" width=\"956\" height=\"676\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/gpio.png 956w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/gpio-300x212.png 300w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/li>\n<li>Finally go to VisualGDB Project Properties and add &#8220;pthread&#8221; and &#8220;wiringPi&#8221; to the library names so that your module is actually linked against the wiringPi library:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/11-libs.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1637\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/11-libs.png\" alt=\"11-libs\" width=\"786\" height=\"594\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/11-libs.png 786w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/11-libs-300x227.png 300w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/><\/a><\/li>\n<li>Now that we have added the sethigh(), setlow() and makeoutput() methods to our module, we will modify the Python script in the project to actually call them. However first we need to find a pin that we will control. According to the <a href=\"https:\/\/www.raspberrypi.org\/documentation\/usage\/gpio-plus-and-raspi2\/\">Raspberry Pi 2 pinout<\/a>, GPIO pin #3 is the lower pin in the 3rd row of the GPIO connector opposite to the ground pin:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/gpio.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1644\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/gpio.jpg\" alt=\"gpio\" width=\"700\" height=\"132\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/gpio.jpg 700w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/gpio-300x57.jpg 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/li>\n<li>Connect an LED there and replace the contents of the Python script with the following code to make the LED on pin #3 blink:\n<pre class=\"\">import PythonWiringDemo\r\nfrom time import sleep\r\npin_number = 3\r\nPythonWiringDemo.makeoutput(pin_number)\r\n\r\nwhile 1:\r\n\u00a0\u00a0\u00a0 PythonWiringDemo.setlow(pin_number)\r\n\u00a0\u00a0\u00a0 sleep(0.2)\r\n\u00a0\u00a0\u00a0 PythonWiringDemo.sethigh(pin_number)\r\n\u00a0\u00a0\u00a0 sleep(0.2)<\/pre>\n<p><a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/12-py.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1638\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/12-py.png\" alt=\"12-py\" width=\"956\" height=\"676\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/12-py.png 956w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/12-py-300x212.png 300w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/li>\n<li>If you try running your program now, the program will exit immediately with a message stating that you need root privilege:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/13-noroot.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1639\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/13-noroot.png\" alt=\"13-noroot\" width=\"956\" height=\"676\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/13-noroot.png 956w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/13-noroot-300x212.png 300w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/li>\n<li>Open VisualGDB Project Properties, go to the Debug Settings page and enable the &#8220;Run debugger as root&#8221; checkbox:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/14-root.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1640\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/14-root.png\" alt=\"14-root\" width=\"786\" height=\"594\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/14-root.png 786w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/14-root-300x227.png 300w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/><\/a><\/li>\n<li>Now you can press F5 to start debugging your program. The LED should now start blinking:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/led.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1645\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/led.jpg\" alt=\"led\" width=\"700\" height=\"444\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/led.jpg 700w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/led-300x190.jpg 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/li>\n<li>Set a breakpoint at the call to PythonWiringDemo.sethigh() and wait for it to trigger:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/15-sethighpy.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1641\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/15-sethighpy.png\" alt=\"15-sethighpy\" width=\"956\" height=\"676\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/15-sethighpy.png 956w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/15-sethighpy-300x212.png 300w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/li>\n<li>Stepping in would step into the Python&#8217;s code responsible for calling C functions, so instead set a breakpoint in the SetPin() function and press F5 to continue. See how our C++ wrapper gets called from the Python script and passes the pin number specified in the script to the <strong>digitalWrite()<\/strong> function provided by the wiringPi library:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/16-sethighcpp.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1642\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/16-sethighcpp.png\" alt=\"16-sethighcpp\" width=\"956\" height=\"676\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/16-sethighcpp.png 956w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2016\/03\/16-sethighcpp-300x212.png 300w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/li>\n<\/ol>\n<p>You can use the technique described in this tutorial to interface any C\/C++ library to the your Python scripts. Simply create a Python module referencing the library, define your functions in the function table and call the functions from the Python side.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial shows how to interface a C library to a Python script on Raspberry Pi with VisualGDB. We will<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[72,122,43],"_links":{"self":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/1625"}],"collection":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/comments?post=1625"}],"version-history":[{"count":1,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/1625\/revisions"}],"predecessor-version":[{"id":1646,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/1625\/revisions\/1646"}],"wp:attachment":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/media?parent=1625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/categories?post=1625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/tags?post=1625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}