Package: dyn2py
dyn2pyExtract python code from Dynamo graphsUse cases:Track changes in python nodes in source control systems like gitWork on python code in your favorite code editor outside Dynamo.dyn2pycan also update Dynamo graphs from previously exported python files.InstallationWindows portable and installerPrebuilt portable exe and installer available from github releases.No requirements, just downloaddyn2py.exeordyn2py-installer.exefrom release assets:https://github.com/infeeeee/dyn2py/releases/latestInstaller automatically adds the install folder to the path, so simplydyn2pycan be called from anywhere.With pipFor usage as a module or as a command line programRequirements: python, pippip install dyn2pyUsageAs a standalone command line program> dyn2py --help
usage: dyn2py [-h] [-v] [-l LOGLEVEL] [-n] [-F] [-b] [-f {py,dyn}] [-u] [-p path/to/folder] [source ...]

Extract python code from Dynamo graphs

positional arguments:
  source                path to a Dynamo graph, a python script or a folder containing them

options:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -l LOGLEVEL, --loglevel LOGLEVEL
                        set log level, possible options: HEADLESS, CRITICAL, ERROR, WARNING, INFO, DEBUG
  -n, --dry-run         do not modify files, only show log
  -F, --force           overwrite even if the files are older
  -b, --backup          create a backup for updated files
  -f {py,dyn}, --filter {py,dyn}
                        only check python or Dynamo graphs, skip the others, useful for folders

dynamo options, only for processing Dynamo graphs:
  -u, --update          update Dynamo graph from python scripts in the same folder
  -p path/to/folder, --python-folder path/to/folder
                        extract python scripts to this folder, read python scripts from here with --update

The script by default overwrites older files with newer files.
Do not move the source Dynamo graphs, or update won't work with them later.
Multiple sources are supported, separate them by spaces.
HEADLESS loglevel only prints modified filenames.ExamplesNotes: In Windows cmd use backward slashes as path separators, in any other shells use forward slashes. Powershell accepts both of them. Wrap paths with spaces in double quotes.# Extract all nodes next to a Dynamo file:dyn2pypath/to/dynamofile.dyn# Update a Dynamo file from previously exported and modified python files:dyn2py--updatepath/to/dynamofile.dyn# Extract python nodes to a specific folder, process multiple Dynamo files:dyn2py--python-folderpath/to/pythonfilespath/to/dynamofile1.dynpath/to/dynamofile2.dyn# Update Dynamo files from python files from a folder. Only check python files, create backups:dyn2py--filterpy--backuppath/to/pythonfilesGit hooksGit hooks are a built-in feature of Git that allow developers to automate tasks throughout the Git workflow. Read more here:https://githooks.com/With thepre-commithook it's possible to add more files to the currently initialized commit.You can find an example pre-commit hook here:pre-commit. Copy this file to the.git/hooksfolder of your repo of Dynamo graphs. This folder is hidden by default, but it should exist in all initialized git repo. Do not rename this file.This script will go through staged.dynfiles and export python scripts from them, and add them to the current commit. Now you can check changed lines in a diff tool, you can see changed python code in a PR!As a python moduleFull API documentation available here:https://infeeeee.github.io/dyn2pyExamplesExtract all nodes from python nodes next to a Dynamo file:importdyn2py# Open a Dynamo graph:dynamo_file=dyn2py.DynamoFile("path/to/dynamofile.dyn")# Extract python nodes:dynamo_file.extract_python()# Save all python nodes as separate files:dyn2py.PythonFile.write_open_files()Update python node from a python file:importdyn2py# Open a python file:python_file=dyn2py.PythonFile("path/to/pythonfile.py")# Update the node in the graph:python_file.update_dynamo()# Save modified Dynamo graph:dyn2py.DynamoFile.write_open_files()Update all python nodes of a Dynamo grapg from a different folder, save backups:importdyn2py# open a Dynamo graph:dynamo_file=dyn2py.DynamoFile("path/to/dynamofile.dyn")# Get python files from a dofferent folder:python_files=dynamo_file.get_related_python_files(python_folder="path/to/pythonfiles")# Read python files and update the graph:[python_file.update_dynamo()forpython_fileinpython_files]# Save open Dynamo graphs:dyn2py.DynamoFile.write_open_files(backup=True)For more examples check tests in thetests folder on GithubThey should work in Dynamo, inside CPython3 nodes.TroubleshootingIf you have a problem, open anissue on GithubYou can also ask about this project onDynamo Forum, don't forget to ping me:@infeeeeeLimitationsOnly supports Dynamo 2 files, Dynamo 1 files are reported and ignored. Please update them to Dynamo 2 by opening them in Dynamo 2.Both IronPython2 and CPython3 nodes are supported! IronPython2 nodes won't be updated to CPython3, they will be imported as-is.Cannot create new python nodes, only existing ones can be updated.DevelopmentInstallationRequirements: git, python, pipgit clone https://github.com/infeeeee/dyn2py
cd dyn2py
pip install -e .With venv:git clone https://github.com/infeeeee/dyn2py
cd dyn2py
python -m venv .venv
. ./.venv/bin/activate
pip install -e .Build for Windowspip install -e .[build]
pyinstaller dyn2py.specCreate installer for WindowsInstall Inno Setup:https://jrsoftware.org/isdl.phpBuild an exeRundyn2py-installer.ps1in powershellLive module documentationpip install -e .[doc]
pdoc -d google dyn2pyUnit testsVSCode should automatically discover unit tests.To run them manually:python -m unittest discover -v -s ./tests -p "test_*.py"New releaseUpdate version number inpyproject.tomlCreate and publish a git tag with that numberLicenseGPL-3.0