# How to handle creating a node group in a script?

I am attempting to make a python script that creates a nodegroup based on some scene properties, however the group_make operator needs to be in a node editor context to run.

It seems awkward to try and make a node view temporarily while the script is running, as the plan is to create the nodegroup with a fake user and have the user add it from the add menu in the node editor.

Update: I have found that you can create node groups without a node editor with bpy.data.node_groups.new (thanks to ideasman42's comment here), however I still can't figure out how to add nodes to it.

How can I edit the nodes inside nodegroup without a node editor?

I can't find node_tree for my node group. Here is my problem:

eq_node = bpy.data.node_groups.new("Equal", "ShaderNodeTree")

tree = eq_node.node_tree #This gives "no such attribute 'node_tree'". How can I acces the node tree of the node group?
nodes = tree.nodes

#Create nodes in node group here with nodes.new

• Have a look at addons_contrib/online_mat_lib. It saves materials out to a text file which can then be loaded in another blend file, it saves groups and I'm pretty sure it re-creates them without the node view visible, and it is a large script. – sambler Dec 9 '13 at 9:08

Thanks to iKlsR's response the complete answer here becomes mostly the same -

import bpy

# create a group

# create group inputs
group_inputs = test_group.nodes.new('NodeGroupInput')
group_inputs.location = (-350,0)
test_group.inputs.new('NodeSocketFloat','in_to_greater')
test_group.inputs.new('NodeSocketFloat','in_to_less')

# create group outputs
group_outputs = test_group.nodes.new('NodeGroupOutput')
group_outputs.location = (300,0)
test_group.outputs.new('NodeSocketFloat','out_result')

# create three math nodes in a group

node_greater.operation = 'GREATER_THAN'
node_greater.label = 'greater'
node_greater.location = (-100,100)

node_less.operation = 'LESS_THAN'
node_less.label = 'less'
node_less.location = (-100,-100)



To perform the same in 2.66 or older use -

import bpy

# create a group

# create group inputs and outputs
test_group.inputs.new('in_to_greater','VALUE')
test_group.outputs.new('out_result','VALUE')

• Thanks. Should this be reported as a bug? – gandalf3 Dec 10 '13 at 20:18
• Possibly, I found three closed bug reports (T26171 T36584 and T36808) that make me think we are missing something. If I can't find a solution later today I'll submit a bug report. – sambler Dec 11 '13 at 0:03
• If you want to follow or comment I have submitted T37776 – sambler Dec 11 '13 at 7:10
• So it's solved? You should add an answer how (crosspost from phab) and accept yourself. – CodeManX Dec 11 '13 at 21:08
• I have updated the answer to show only the working code, and linked to the similar answer that gave the missing key to getting it working. – sambler Dec 12 '13 at 1:28