{"id":10216,"date":"2021-08-22T10:10:32","date_gmt":"2021-08-22T08:10:32","guid":{"rendered":"https:\/\/pythonprogramming.altervista.org\/?p=10216"},"modified":"2021-08-22T10:10:33","modified_gmt":"2021-08-22T08:10:33","slug":"how-to-kill-python-processes-with-python-itself","status":"publish","type":"post","link":"https:\/\/pythonprogramming.altervista.org\/how-to-kill-python-processes-with-python-itself\/","title":{"rendered":"How to kill python processes with Python itself"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A lot of times we run scripts with python and something goes wrong, so the processes remains in the cpu and we cannot close a window or we do not even know that the processes haven&#8217;t been closed correctly. So, we can go ctrl+alt+canc and go find the process and kill it, searching among all the processes the python process that is still on. But this takes a lot of time, so, wouldn&#8217;t it be nice to have a script that we can call from the cmd that makes the work for us? Here is the script. Put it in a folder that is in the environment path of windows and create a batch file that runs it that is also in a environment path of windows, so that you can run it simply with a word like, for example, kill.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/pythonprogramming.altervista.org\/run-your-py-script-from-the-cmd-with-its-name\/\">Go here<\/a> to see how to run script from cmd <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the code of the script, it uses pysimplegui and psutil. Pip install pysimplegui psutil if you have not this modules.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/usr\/bin\/env python\nimport PySimpleGUI as sg\nimport os\nimport signal\nimport psutil\nimport operator\nimport sys\n\nCONFIRM_KILLS = False\n\n\"\"\"\n    Task killer program focused on Python only programs\n    \n    While there is another demo program that handles all running processes, this specific\n    demo is for Python oriented processes only.  It is based on the original, more general\n    purpose task killer demo.\n    \n    In addition to filtering out all but Python programs, it also displays the command line used\n    to launch the program.  This is particularly good for programs that have no titlebar or\n    are running in the background or system tray.\n\n    Copyright 2020 PySimpleGUI.org\n\"\"\"\n\n\ndef kill_proc_tree(pid, sig=signal.SIGTERM, include_parent=True,\n                   timeout=None, on_terminate=None):\n    \"\"\"Kill a process tree (including grandchildren) with signal\n    \"sig\" and return a (gone, still_alive) tuple.\n    \"on_terminate\", if specified, is a callabck function which is\n    called as soon as a child terminates.\n    \"\"\"\n    if pid == os.getpid():\n        raise RuntimeError(\"I refuse to kill myself\")\n    parent = psutil.Process(pid)\n    children = parent.children(recursive=True)\n    if include_parent:\n        children.append(parent)\n    for p in children:\n        p.send_signal(sig)\n    gone, alive = psutil.wait_procs(children, timeout=timeout,\n                                    callback=on_terminate)\n    return (gone, alive)\n\n\ndef kill_proc(pid, sig=signal.SIGTERM, include_parent=True,\n                   timeout=None, on_terminate=None):\n    \"\"\"Kill a process tree (including grandchildren) with signal\n    \"sig\" and return a (gone, still_alive) tuple.\n    \"on_terminate\", if specified, is a callabck function which is\n    called as soon as a child terminates.\n    \"\"\"\n    if pid == os.getpid():\n        raise RuntimeError(\"I refuse to kill myself\")\n    parent = psutil.Process(pid)\n    parent.send_signal(sig)\n\n\ndef get_all_procs():\n    psutil.cpu_percent(interval=.1)\n    procs = psutil.process_iter()\n    all_procs = []\n    for proc in procs:\n        try:\n            all_procs.append([proc.cpu_percent(), proc.name(), proc.pid, proc.cmdline()])\n        except: pass\n\n    disp_data = []\n    for process in all_procs:\n        try:\n            name = process[3][1]\n        except:\n            name = ''\n        disp_data.append([process[2], process[0]\/10, process[1], name])\n    return disp_data\n\n\ndef show_list_by_name():\n    disp_data = get_all_procs()\n    disp_data = sorted(disp_data, key=operator.itemgetter(3), reverse=False)\n    display_list = []\n    for process in disp_data:\n        if 'python' in process[2].lower():\n            display_list.append('{:5d} {:5.2f} {} {}\\n'.format(process[0], process[1], process[2], process[3]))\n    return display_list\n\n\ndef show_list_by_cpu():\n    disp_data = get_all_procs()\n    disp_data = sorted(disp_data, key=operator.itemgetter(1), reverse=True)\n\n    display_list = []\n    for process in disp_data:\n        if 'python' in process[2].lower():\n            display_list.append('{:5d} {:5.2f} {} {}\\n'.format(process[0], process[1], process[2], process[3]))\n    return display_list\n\n\ndef make_window():\n    layout = [[sg.Text('Python Process Killer - Choose one or more processes',\n                       size=(45, 1), font=('Helvetica', 15), text_color='yellow')],\n              [sg.Listbox(values=[' '], size=(100, 20), select_mode=sg.SELECT_MODE_EXTENDED, font=('Courier', 10), key='-processes-')],\n              [sg.Text('Click refresh once or twice.. once for list, second to get CPU usage')],\n              [sg.Text('Filter by typing name', font='ANY 14'), sg.Input(size=(15, 1), font='any 14', key='-filter-')],\n              [sg.Button('Sort by Name', ),\n               sg.Button('Sort by % CPU', button_color=('white', 'DarkOrange2')),\n               sg.Button('Kill Selected', button_color=('white', 'red'), bind_return_key=True),\n               sg.Button('Kill All', button_color='red on white'),\n               sg.Button('Kill All &amp; Exit', button_color='red on white'),\n               sg.Exit(button_color=('white', 'sea green'))]]\n\n    window = sg.Window('Python Process Killer', layout,\n                       keep_on_top=True,\n                       auto_size_buttons=False,\n                       default_button_element_size=(12, 1),\n                       return_keyboard_events=True,\n                       finalize=True)\n\n    return window\n\ndef kill_all():\n    processes_to_kill = show_list_by_name()\n    for proc in processes_to_kill:\n        pid = int(proc[0:5])\n        try:\n            kill_proc(pid=pid)\n            # kill_proc_tree(pid=pid)\n        except Exception as e:\n            pass\n\ndef main(silent=False):\n    if silent:\n        kill_all()\n        sg.popup_auto_close('Killed everything....', 'This window autocloses')\n        sys.exit()\n    # ----------------  Create Form  ----------------\n    sg.theme('Dark Grey 9')\n    window = make_window()\n    display_list = show_list_by_name()\n    window['-processes-'].update(display_list)\n    name_sorted = True\n    # ----------------  main loop  ----------------\n    while True:\n        # --------- Read and update window --------\n        event, values = window.read()\n        if event in (sg.WIN_CLOSED, 'Exit'):\n            break\n\n        # skip mouse, control key and shift key events entirely\n        if 'Mouse' in event or 'Control' in event or 'Shift' in event:\n            continue\n\n        # --------- Do Button Operations --------\n        if event == 'Sort by Name':\n            window['-processes-'].update(show_list_by_name())\n            name_sorted = True\n        elif event.startswith('Kill'):\n            if event.startswith('Kill All'):\n                processes_to_kill = show_list_by_name()\n            else:\n                processes_to_kill = values['-processes-']\n            for proc in processes_to_kill:\n                pid = int(proc[0:5])\n                try:\n                    kill_proc(pid=pid)\n                    # kill_proc_tree(pid=pid)\n                except Exception as e:\n                    if event.endswith('Selected'):      # only show the error if trying to kill only 1 process\n                        sg.popup_no_wait('Error killing process', e, auto_close_duration=2, auto_close=True, keep_on_top=True)\n            window['-processes-'].update(show_list_by_name() if name_sorted else show_list_by_cpu())\n            if event.endswith('Exit'):\n                break\n        elif event == 'Sort by % CPU':\n            window['-processes-'].update(show_list_by_cpu())\n            name_sorted = False\n        else:  # was a typed character\n            if display_list is not None:\n                new_output = []\n                for line in display_list:\n                    if values['-filter-'] in line.lower():\n                        new_output.append(line)\n                window['-processes-'].update(new_output)\n    window.close()\n\n\nif __name__ == \"__main__\":\n    if len(sys.argv) == 2 and sys.argv[1] == 'silent':\n        main(silent=True)\n    else:\n        main(silent=False)\n<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2021\/08\/image-65.png\"><img loading=\"lazy\" decoding=\"async\" width=\"907\" height=\"531\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2021\/08\/image-65.png\" alt=\"\" class=\"wp-image-10218\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2021\/08\/image-65.png 907w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2021\/08\/image-65-320x187.png 320w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2021\/08\/image-65-768x450.png 768w\" sizes=\"auto, (max-width: 907px) 100vw, 907px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><!-- se vuoi mettere un testo scorrevole\r\n[hoops name=\"typeWriterGen\"]\r\n\r\npoi metti un id diverso per ogni testo nella stessa pagina\r\n\r\n<div id=\"div01\">\r\n<script>\r\n\r\ntypeWriterGen(\"div01\",\"Esempio di testo scorrevole\");\r\n<\/script>\r\n\r\n-->\r\n<style>\r\n.avatar {\r\n  vertical-align: middle;\r\n  width: 100px;\r\n  height: 100px;\r\n  border-radius: 50%;\r\n}\r\n<\/style>\r\n\r\n<hr>\r\n\r\n<!-- NEWSLETTER LINK -->\r\n<a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSf7TniIPCWHDzCSGh2dYZaCwDvi9yLKS5ovFdKuK1sdfOvwEg\/viewform\">\r\n<img decoding=\"async\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-13.png\" class=\"avatar\">\r\nSubscribe to the <b>newsletter<\/b> for updates<\/a><br>\r\n\r\n<!-- TKINTER TEMPLATE LINK -->\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/tkinter-templates\/\">\r\n<img decoding=\"async\" src=\"https:\/\/i0.wp.com\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/07\/image-26.png\" class=\"avatar\">\r\nTkinter templates<\/a><br>\r\n\r\n<!-- MY AVATAR PUT A LINK TO YOUTUBE CHANNEL-->\r\n<iframe loading=\"lazy\" frameborder=\"0\" src=\"https:\/\/itch.io\/embed\/711828\" width=\"552\" height=\"167\"><a href=\"https:\/\/pythonprogrammi.itch.io\/pysnake\">PySnake by PythonProgrammi<\/a><\/iframe>\r\n<br>\r\n<style>\r\n.avatar {\r\n  vertical-align: middle;\r\n  width: 100px;\r\n  height: 100px;\r\n  border-radius: 50%;\r\n}\r\n<\/style>\r\n\r\n\r\n<a href=\"https:\/\/www.youtube.com\/channel\/UCzbxq5e9gLiY-je2-br1rvg\">\r\n\t<img decoding=\"async\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/10\/avatar64x64.png\" alt=\"Avatar\" class=\"avatar\">\r\n\t My youtube channel<\/a><br>\r\n\r\n<br>\r\n\r\nTwitter: <a href=\"https:\/\/twitter.com\/pythonprogrammi\">@pythonprogrammi - python_pygame<\/a>\r\n<h3>Claude's Games<\/h3>\r\n<p><a href=\"https:\/\/pythonprogramming.altervista.org\/random-daily-game-1-arkanoid\/\">Arkanoid<\/a><br>\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/platform-2d-with-pygame-made-with-claude\/\">Platform 2d<\/a><\/p> <!-- videogames made with claude -->\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/artifacts-games-day-1-memory-game\/\">1. Memory game<\/a>\r\n<h4>Videos<\/h4>\r\n<a href=\"https:\/\/youtu.be\/ciLjWWw5pLY\">Speech recognition game<\/a>\r\n<h3>Pygame's Platform Game<\/h3>\r\n\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-5-sounds-and-mixer\/\"><img decoding=\"async\" src=\"https:\/\/i1.wp.com\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/01\/climbercover.png?w=557&ssl=1\"\/ width=\"50%\"><\/a>\r\n<script>\r\nvar title = \"Platform Pygame\";\r\n\t\tvar links = [\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-animation-of-a-sprite-v-1-3\/\",\"Animation 1.3\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-sprite-animation-v-2-better-coding-test-it-checking-fps-on-the-screen\/\",\"Animation 1.2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-how-to-display-the-frame-rate-fps-on-the-screen\/\",\"Display Frame rate\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-sprite-animation-update\/\",\"Animation 1.1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platformer-1\/\",\"Pygame Platform Game 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-platform-game-2\/\",\"Pygame Platform 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-3-recap-cheatsheet\/\",\"Pygame PLatform 3 - recap and some Cheat Sheet\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-4-background-and-stuffs\/\",\"Pygame Platform 4 - Background & organizing code\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-5-sounds-and-mixer\/\",\"Pygame Platform 5 - Sounds\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/platform-game-in-detail-part-1\/\",\"Game in detail part 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/map-maker-1-2\/\", \"Map maker 1.2\"]\r\n\t\t];\r\n\t\t<\/script>\r\n<script>\r\n\t\r\nif (typeof next2 != \"undefined\"){let next2 = 0;}\r\n\t\r\nnext2 = 0;\r\n\thtml = \"\";\/\/<b style='color:coral;font-size:1.2em'>Other posts about \" + title + \"<\/b><br>\";\r\nfor (address of links) \r\n{\r\n\r\n\tif (next2 == 1){\r\n\t\thtml += \"<div style='background:coral'>\";\r\n\t\thtml += \"Next link => <a href='\" + address[0] + \"'>\" + address[1] + \"<\/a>\";\r\n\t\thtml += \"<\/div><br>\";\r\n\t\tnext2 = 0;\r\n\t}\r\n\tif (address[0] == document.URL) {\r\n\t\tnext2 = 1;\r\n\t}\r\n}\r\n\r\nif (typeof next != \"undefined\") {let next = 0;}\r\nif (typeof addressStart != \"undefined\") {let addressStart = \"\";}\r\nnext = 0;\r\naddressStart = \"<a href='\";\r\nfor (address of links) {\r\n\tif (next == 1){\r\n\t\thtml += \">>>\" + addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t\tnext = 0;\r\n\t}\r\n\telse if (addressStart + address[0] != document.URL)\r\n\t{\r\n\t\thtml += addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t}\r\n\telse\r\n\t{\r\n\t\tnext = 1;\r\n\t\tnext_address = address[0]\r\n\t\tnext_title = address[1]\r\n\t\thtml += \"<span style='color:gray'>\" + address[1] + \"<\/span><br>\";\r\n\t}\r\n\r\n}\r\n\r\n\thtml += `<span style=\"font-size:8px\">Powered by <a href=\"https:\/\/pythonprogramming.altervista.org\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2673\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png\" alt=\"\" width=\"70\" height=\"25\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png 156w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2-150x56.png 150w\" sizes=\"auto, (max-width: 70px) 100vw, 70px\" \/>pythonprogramming.altervista.org<\/a><\/span>`\r\n\thtml = \"<div style='background:yellow'>\" + html + \"<\/div>\";\r\n\tdocument.write(html)\r\n<\/script>\r\n\r\n<h3>Other Pygame's posts<\/h3>\r\n\r\n<script>\r\nvar title = \"Pygame's Posts\"\r\nvar links = [\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platformer-1\/\",\"Platform game 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/make-a-platform-game-with-pygame-dafluffypotato\/\",\"DaFluffyPotato Platform Tutorials\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-and-classic-arcade-games-pong\/\",\"Pong Game Full\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-draws-in-colors-app-to-draw-with-pygame\/\",\"PyGameGIF 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-draw-app-with-animation\/\",\"PyGameGIF 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pydraw-2-0-app-to-draw-gif\/\",\"PyDraw 2.0\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-drawing-2\/\",\"Draw with Pygame\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/animation-with-pygame\",\"Sprite animation 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/animation-on-pygame-2-free-characters-and-more-actions\/\",\"Sprite animation 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/starting-with-pygame\/\",\"Starting movements with Pygame\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-3-move-sprite\/\", \"Move a Sprite\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-4-fonts\/\",\"Text and Fonts\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-animate-a-sprite\/\", \"Animate a sprite\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-and-mouse-events\/\",\"Mouse events\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pgp-aka-pygamepresentation-project\/\",\"Pygame presentation\"],\r\n\t[\"https:\/\/pythonprogramming.altervista.org\/moving-the-player-in-pygame-with-key-get_pressed\/\",\"How to use key.get_pressed()\"]\r\n]\r\n<\/script>\r\n\r\n\r\n<script>\r\n\t\r\nif (typeof next2 != \"undefined\"){let next2 = 0;}\r\n\t\r\nnext2 = 0;\r\n\thtml = \"\";\/\/<b style='color:coral;font-size:1.2em'>Other posts about \" + title + \"<\/b><br>\";\r\nfor (address of links) \r\n{\r\n\r\n\tif (next2 == 1){\r\n\t\thtml += \"<div style='background:coral'>\";\r\n\t\thtml += \"Next link => <a href='\" + address[0] + \"'>\" + address[1] + \"<\/a>\";\r\n\t\thtml += \"<\/div><br>\";\r\n\t\tnext2 = 0;\r\n\t}\r\n\tif (address[0] == document.URL) {\r\n\t\tnext2 = 1;\r\n\t}\r\n}\r\n\r\nif (typeof next != \"undefined\") {let next = 0;}\r\nif (typeof addressStart != \"undefined\") {let addressStart = \"\";}\r\nnext = 0;\r\naddressStart = \"<a href='\";\r\nfor (address of links) {\r\n\tif (next == 1){\r\n\t\thtml += \">>>\" + addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t\tnext = 0;\r\n\t}\r\n\telse if (addressStart + address[0] != document.URL)\r\n\t{\r\n\t\thtml += addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t}\r\n\telse\r\n\t{\r\n\t\tnext = 1;\r\n\t\tnext_address = address[0]\r\n\t\tnext_title = address[1]\r\n\t\thtml += \"<span style='color:gray'>\" + address[1] + \"<\/span><br>\";\r\n\t}\r\n\r\n}\r\n\r\n\thtml += `<span style=\"font-size:8px\">Powered by <a href=\"https:\/\/pythonprogramming.altervista.org\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2673\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png\" alt=\"\" width=\"70\" height=\"25\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png 156w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2-150x56.png 150w\" sizes=\"auto, (max-width: 70px) 100vw, 70px\" \/>pythonprogramming.altervista.org<\/a><\/span>`\r\n\thtml = \"<div style='background:yellow'>\" + html + \"<\/div>\";\r\n\tdocument.write(html)\r\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"A lot of times we run scripts with python and something goes wrong, so the processes remains in the cpu and we cannot \n<a class=\"moretag\" href=\"https:\/\/pythonprogramming.altervista.org\/how-to-kill-python-processes-with-python-itself\/\"> [...]<\/a>","protected":false},"author":1,"featured_media":10218,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","footnotes":""},"categories":[1],"tags":[801,1011],"class_list":["post-10216","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-examples","tag-kill","tag-processes"],"avopt_banners_inside_post":true,"avopt_banners_on_page":true,"av_copy_from":"","av_sharing_message":"","av_sharing_allowed":true,"av_sharing_on":{"fb":[],"tw":[]},"av_allow_affiliate_banner":false,"av_allow_affiliate_multi_banner":false,"av_show_affiliation_buy_button":false,"av_post_rating":true,"av_have_post_rating_value":false,"av_is_artificial_intelligence_content":false,"_links":{"self":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/10216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/comments?post=10216"}],"version-history":[{"count":2,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/10216\/revisions"}],"predecessor-version":[{"id":10219,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/10216\/revisions\/10219"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media\/10218"}],"wp:attachment":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media?parent=10216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/categories?post=10216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/tags?post=10216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}