{"id":32116846,"url":"https://github.com/pydot/pydot","last_synced_at":"2026-02-21T10:31:41.332Z","repository":{"id":30323619,"uuid":"33875901","full_name":"pydot/pydot","owner":"pydot","description":"Python interface to Graphviz's Dot language","archived":false,"fork":false,"pushed_at":"2025-12-03T07:51:58.000Z","size":2213,"stargazers_count":975,"open_issues_count":59,"forks_count":169,"subscribers_count":22,"default_branch":"main","last_synced_at":"2025-12-08T15:05:01.252Z","etag":null,"topics":["dot-language","graphviz","hacktoberfest","python"],"latest_commit_sha":null,"homepage":"https://pypi.python.org/pypi/pydot","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pydot.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","contributing":null,"funding":null,"license":"LICENSES/MIT.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-04-13T15:14:44.000Z","updated_at":"2025-12-03T07:47:13.000Z","dependencies_parsed_at":"2022-07-18T08:17:19.743Z","dependency_job_id":"bea7d167-8b9d-4253-be70-753fd90af740","html_url":"https://github.com/pydot/pydot","commit_stats":{"total_commits":238,"total_committers":23,"mean_commits":"10.347826086956522","dds":"0.47478991596638653","last_synced_commit":"90936e75462c7b0e4bb16d97c1ae7efdf04e895c"},"previous_names":["erocarrera/pydot"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/pydot/pydot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pydot%2Fpydot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pydot%2Fpydot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pydot%2Fpydot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pydot%2Fpydot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pydot","download_url":"https://codeload.github.com/pydot/pydot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pydot%2Fpydot/sbom","scorecard":{"id":751297,"data":{"date":"2025-08-17T15:34:40Z","repo":{"name":"github.com/pydot/pydot","commit":"18eb8e9669490e1f3eb33bbcb50f9c0dfa80d672"},"scorecard":{"version":"v5.0.0","commit":"ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4"},"score":6.9,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#binary-artifacts"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disable on branch 'main'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'main'","Warn: PRs are not required to make changes on branch 'main'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#branch-protection"}},{"name":"CI-Tests","score":10,"reason":"23 out of 23 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#ci-tests"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#cii-best-practices"}},{"name":"Code-Review","score":6,"reason":"Found 17/25 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#code-review"}},{"name":"Contributors","score":10,"reason":"project has 32 contributing companies or organizations","details":["Info: python contributor org/company found, nordsoftware contributor org/company found, python-humanize contributor org/company found, fatiando contributor org/company found, citybikes contributor org/company found, NaNoGenMo contributor org/company found, termcolor contributor org/company found, flake8-implicit-str-concat contributor org/company found, nextcloud contributor org/company found, kuralabs contributor org/company found, GSConnect contributor org/company found, EuroPython contributor org/company found, pytest-dev contributor org/company found, NaPoGenMo contributor org/company found, python-twitter-tools contributor org/company found, pydata-helsinki contributor org/company found, pydot contributor org/company found, mobbler contributor org/company found, WahKazoo contributor org/company found, python-docs-translations contributor org/company found, unitedstates contributor org/company found, whyaretheflagsup contributor org/company found, cycle148hki contributor org/company found, endoflife-date contributor org/company found, helsinki-python contributor org/company found, prettytable contributor org/company found, python-pillow contributor org/company found, PyConFI contributor org/company found, sovereigntech contributor org/company found, pylast contributor org/company found, jazzband contributor org/company found, ultrajson contributor org/company found, "],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#contributors"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#dangerous-workflow"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#dependency-update-tool"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSES/MIT.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSES/MIT.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#license"}},{"name":"Maintained","score":7,"reason":"5 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":4,"reason":"dependency not pinned by hash detected -- score normalized to 4","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/CI.yml:130: update your workflow using https://app.stepsecurity.io/secureworkflow/pydot/pydot/CI.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/CI.yml:140: update your workflow using https://app.stepsecurity.io/secureworkflow/pydot/pydot/CI.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/CI.yml:146: update your workflow using https://app.stepsecurity.io/secureworkflow/pydot/pydot/CI.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/pydot/pydot/coverage.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/reuse.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/pydot/pydot/reuse.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/reuse.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/pydot/pydot/reuse.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/CI.yml:77","Warn: pipCommand not pinned by hash: .github/workflows/CI.yml:129","Info:  13 out of  16 GitHub-owned GitHubAction dependencies pinned","Info:   2 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 21 commits out of 23 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#sast"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#signed-releases"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/CI.yml:117","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:32","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:33","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/coverage.yml:24","Info: jobLevel 'actions' permission set to 'read': .github/workflows/coverage.yml:28","Info: topLevel 'contents' permission set to 'read': .github/workflows/CI.yml:27","Info: topLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:25","Warn: no topLevel permission defined: .github/workflows/coverage.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/label-conflicts.yml:20","Warn: no topLevel permission defined: .github/workflows/reuse.yml:1","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard.yml:18"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#token-permissions"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T20:28:07.447Z","repository_id":30323619,"created_at":"2025-08-22T20:28:07.447Z","updated_at":"2025-08-22T20:28:07.447Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27667482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-11T02:00:11.302Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dot-language","graphviz","hacktoberfest","python"],"created_at":"2025-10-20T16:15:15.681Z","updated_at":"2025-12-11T22:49:58.946Z","avatar_url":"https://github.com/pydot.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nSPDX-FileCopyrightText: 2024 pydot contributors\n\nSPDX-License-Identifier: MIT\n--\u003e\n\n![CI](https://github.com/pydot/pydot/actions/workflows/CI.yml/badge.svg)\n[![Coverage](https://raw.githubusercontent.com/pydot/pydot/python-coverage-comment-action-data/badge.svg)](https://htmlpreview.github.io/?https://github.com/pydot/pydot/blob/python-coverage-comment-action-data/htmlcov/index.html)\n[![PyPI](https://img.shields.io/pypi/v/pydot.svg)](https://pypi.org/project/pydot/)\n[![Code style: ruff](https://img.shields.io/badge/code%20style-ruff-purple.svg)](https://github.com/astral-sh/ruff)\n\n# Pydot\n\n`pydot` is a Python interface to Graphviz and its DOT language. You can use `pydot` to create, read, edit, and visualize graphs.\n\n- It's made in pure Python, with only one dependency – pyparsing – other than Graphviz itself.\n- It's compatible with `networkx`, which can convert its graphs to `pydot`.\n\nTo see what Graphviz is capable of, check the [Graphviz Gallery](https://graphviz.org/gallery/)!\n\n## Dependencies\n\n- Python: The latest version of pydot supports Python 3.9+. It may work with Python 3.6-3.8, but we can't guarantee full support. If you're using one of these older versions, feel free to experiment, but we won't be able to address issues specific to them. Older versions of pydot are also an option.\n- [`pyparsing`][pyparsing]: used only for *loading* DOT files, installed automatically during `pydot` installation.\n- GraphViz: used to render graphs in a variety of formats, including PNG, SVG, PDF, and more.\n  Should be installed separately, using your system's [package manager][pkg], something similar (e.g., [MacPorts][mac]), or from [its source][src].\n\n## Installation\n\n- Latest release, from [PyPI][pypi]:\n\n  ```bash\n  pip install pydot\n  ```\n\n- Current development code, from this repository:\n\n  ```bash\n  pip install git+https://github.com/pydot/pydot.git\n  ```\n\n- Development installation, to modify the code or contribute changes:\n\n  ```bash\n  # Clone the repository\n  git clone https://github.com/pydot/pydot\n  cd pydot\n\n  # (Optional: create a virtual environment)\n  python3 -m venv _venv\n  . ./_venv/bin/activate\n\n  # Make an editable install of pydot from the source tree\n  pip install -e .\n  ```\n\n## Quickstart\n\n### 1. Input\n\nNo matter what you want to do with `pydot`, you'll need some input to start with. Here are the common ways to get some data to work with.\n\n#### Import a graph from an existing DOT file\n\nLet's say you already have a file `example.dot` (based on an [example from Wikipedia][wiki_example]):\n\n```dot\ngraph my_graph {\n    bgcolor=\"yellow\";\n    a [label=\"Foo\"];\n    b [shape=circle];\n    a -- b -- c [color=blue];\n}\n```\n\nYou can read the graph from the file in this way:\n\n```python\nimport pydot\n\ngraphs = pydot.graph_from_dot_file(\"example.dot\")\ngraph = graphs[0]\n```\n\n#### Parse a graph from an existing DOT string\n\nUse this method if you already have a string describing a DOT graph:\n\n```python\nimport pydot\n\ndot_string = \"\"\"graph my_graph {\n    bgcolor=\"yellow\";\n    a [label=\"Foo\"];\n    b [shape=circle];\n    a -- b -- c [color=blue];\n}\"\"\"\n\ngraphs = pydot.graph_from_dot_data(dot_string)\ngraph = graphs[0]\n```\n\n#### Create a graph from scratch using pydot objects\n\nThis is where the cool stuff starts. Use this method if you want to build new graphs with Python code.\n\n```python\nimport pydot\n\ngraph = pydot.Dot(\"my_graph\", graph_type=\"graph\", bgcolor=\"yellow\")\n\n# Add nodes\nmy_node = pydot.Node(\"a\", label=\"Foo\")\ngraph.add_node(my_node)\n# Or, without using an intermediate variable:\ngraph.add_node(pydot.Node(\"b\", shape=\"circle\"))\n\n# Add edges\nmy_edge = pydot.Edge(\"a\", \"b\", color=\"blue\")\ngraph.add_edge(my_edge)\n# Or, without using an intermediate variable:\ngraph.add_edge(pydot.Edge(\"b\", \"c\", color=\"blue\"))\n```\n\nYou can use these basic building blocks in your Python program\nto dynamically generate a graph. For example, start with a\nbasic `pydot.Dot` graph object, then loop through your data\nas you add nodes and edges. Use values from your data as labels to\ndetermine shapes, edges and so on. This allows you to easily create\nvisualizations of thousands of related objects.\n\n#### Convert a NetworkX graph to a pydot graph\n\nNetworkX has conversion methods for pydot graphs:\n\n```python\nimport networkx\nimport pydot\n\n# See NetworkX documentation on how to build a NetworkX graph.\ngraph = networkx.drawing.nx_pydot.to_pydot(my_networkx_graph)\n```\n\n### 2. Edit\n\nYou can now further manipulate your graph using pydot methods:\n\nAdd more nodes and edges:\n\n```python\ngraph.add_edge(pydot.Edge(\"b\", \"d\", style=\"dotted\"))\n```\n\nEdit attributes of graphs, nodes and edges:\n\n```python\ngraph.set_bgcolor(\"lightyellow\")\ngraph.get_node(\"b\")[0].set_shape(\"box\")\n```\n\n### 3. Output\n\nHere are three different output options:\n\n#### Generate an image\n\nIf you just want to save the image to a file, use one of the `write_*` methods:\n```python\ngraph.write_png(\"output.png\")\n```\n\nIf you need to further process the image output, the `create_*` methods will get you a Python `bytes` object:\n```python\noutput_graphviz_svg = graph.create_svg()\n```\n\n#### Retrieve the DOT string\n\nThere are two different DOT strings you can retrieve:\n\n- The \"raw\" pydot DOT: This is generated the fastest and will\n  usually still look quite similar to the DOT you put in. It is\n  generated by pydot itself, without calling Graphviz.\n\n  ```python\n  # As a string:\n  output_raw_dot = graph.to_string()\n  # Or, save it as a DOT-file:\n  graph.write_raw(\"output_raw.dot\")\n  ```\n\n- The Graphviz DOT: You can use it to check how Graphviz lays out\n  the graph before it produces an image. It is generated by\n  Graphviz.\n\n  ```python\n  # As a bytes literal:\n  output_graphviz_dot = graph.create_dot()\n  # Or, save it as a DOT-file:\n  graph.write_dot(\"output_graphviz.dot\")\n  ```\n\n#### Convert to a NetworkX graph\n\nNetworkX has a conversion method for pydot graphs:\n\n```python\nmy_networkx_graph = networkx.drawing.nx_pydot.from_pydot(graph)\n```\n\n### More help\n\nFor more help, see the docstrings of the various pydot objects and\nmethods. For example, `help(pydot)`, `help(pydot.Graph)` and\n`help(pydot.Dot.write)`.\n\nMore [documentation contributions welcome][contrib].\n\n## Troubleshooting\n\n### Enable logging\n\n`pydot` uses Python's standard `logging` module. To see the logs,\nassuming logging has not been configured already:\n\n    \u003e\u003e\u003e import logging\n    \u003e\u003e\u003e logging.basicConfig(level=logging.DEBUG)\n    \u003e\u003e\u003e import pydot\n    DEBUG:pydot:pydot initializing\n    DEBUG:pydot:pydot \u003cversion\u003e\n    DEBUG:pydot.core:pydot core module initializing\n    DEBUG:pydot.dot_parser:pydot dot_parser module initializing\n\n**Warning**: When `DEBUG` level logging is enabled, `pydot` may log the\ndata that it processes, such as graph contents or DOT strings. This can\ncause the log to become very large or contain sensitive information.\n\n### Advanced logging configuration\n\n- Check out the [Python logging documentation][log] and the\n  [`logging_tree`][log_tree] visualizer.\n- `pydot` does not add any handlers to its loggers, nor does it setup\n  or modify your root logger. The `pydot` loggers are created with the\n  default level `NOTSET`.\n- `pydot` registers the following loggers:\n  - `pydot`: Parent logger. Emits a few messages during startup.\n  - `pydot.core`: Messages related to pydot objects, Graphviz execution\n                  and anything else not covered by the other loggers.\n  - `pydot.dot_parser`: Messages related to the parsing of DOT strings.\n\n\n## License\n\nDistributed under the [MIT license][MIT].\n\nThe module [`pydot._vendor.tempfile`][tempfile]\nis based on the Python 3.12 standard library module\n[`tempfile.py`][tempfile-src],\nCopyright © 2001-2023 Python Software Foundation. All rights reserved.\nLicensed under the terms of the [Python-2.0][Python-2.0] license.\n\n\n## Contacts\n\nCurrent maintainer(s): \n- Łukasz Łapiński \u003clukaszlapinski7 (at) gmail (dot) com\u003e\n\nPast maintainers:\n- Sebastian Kalinowski \u003csebastian (at) kalinowski (dot) eu\u003e (GitHub: @prmtl)\n- Peter Nowee \u003cpeter (at) peternowee (dot) com\u003e (GitHub: @peternowee)\n\nOriginal author: Ero Carrera \u003cero (dot) carrera (at) gmail (dot) com\u003e\n\n\n[wiki_dot]: https://en.wikipedia.org/wiki/DOT_%28graph_description_language%29\n[networkx]: https://github.com/networkx/networkx\n[pydot_gh]: https://github.com/pydot/pydot\n[wiki_example]: https://en.wikipedia.org/w/index.php?title=DOT_(graph_description_language)\u0026oldid=1003001464#Attributes\n[contrib]: https://github.com/pydot/pydot/issues/130\n[pypi]: https://pypi.org/project/pydot/\n[pyparsing]: https://github.com/pyparsing/pyparsing\n[pkg]: https://en.wikipedia.org/wiki/Package_manager\n[mac]: https://www.macports.org\n[src]: https://gitlab.com/graphviz/graphviz\n[log]: https://docs.python.org/3/library/logging.html\n[log_tree]: https://pypi.org/project/logging_tree/\n[MIT]: https://github.com/pydot/pydot/blob/main/LICENSES/MIT.txt\n[Python-2.0]: https://github.com/pydot/pydot/blob/main/LICENSES/Python-2.0.txt\n[tempfile]: https://github.com/pydot/pydot/blob/main/src/pydot/_vendor/tempfile.py\n[tempfile-src]: https://github.com/python/cpython/blob/8edfa0b0b4ae4235bb3262d952c23e7581516d4f/Lib/tempfile.py\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpydot%2Fpydot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpydot%2Fpydot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpydot%2Fpydot/lists"}