TL;DR: asking a node if it's broken isn't always safe, because it might not know it is broken. Try an alt approach? (see below)
I'd hazard a guess that hasError is a pretty context-sensitive call, since you can error out depending on a whole host of factors (trivially, a missing frame won't error out til you hit it) and errors tend to stop DAG tree processing in interesting ways. Nuke 9.0v8/x64/Win7 here, my results using two groups, each containing a working read and a hard errored read (one pointing to a dummy file, and one pointing at a PDF - both the output pipe of the Group wrapping them). I made three variants, all executed from the script editor: def withHasError1(): groups = nuke.allNodes('Group') reads = [read for grp in groups for read in nuke.allNodes(group = grp) if read.Class() == 'Read' and not read.hasError()] print 'withHasError1: ', [x.fullName() for x in reads] def withHasError2(): groups = nuke.allNodes('Group') reads = [] for grp in groups: with grp: reads += [node for node in nuke.allNodes() if node.Class() == 'Read' and node.hasError()] print 'withHasError2: ', [x.fullName() for x in reads] def withHasError3(): groups = nuke.allNodes('Group') reads = [] for grp in groups: groupnodes = nuke.allNodes(group = grp) reads += [node for node in groupnodes if node.Class() == 'Read' and node.hasError()] print 'withHasError3: ', [x.fullName() for x in reads] def withHasError4(): groups = nuke.allNodes('Group') reads = [] for grp in groups: groupnodes = nuke.allNodes(group = grp) reads += [node for node in groupnodes if node.Class() == 'Read'] for grp in groups: grp.begin() reads = [node for node in reads if node.hasError()] grp.end() print 'withHasError4: ', [x.fullName() for x in reads] def withoutHasError(): groups = nuke.allNodes('Group') reads = [read for grp in groups for read in nuke.allNodes(group = grp) if read.Class() == 'Read'] print 'withoutHasError: ', [x.fullName() for x in reads] print withHasError1() withHasError2() withHasError3() withHasError4() withoutHasError() # Result: withHasError1: ['Group1.Read2'] withHasError2: # ['Group1.Err', 'Group2.err'] withHasError3: ['Group1.Err', # 'Group2.Read1', 'Group2.err'] withHasError4: ['Group1.Err', # 'Group2.err'] withoutHasError: ['Group1.Read2', 'Group1.Err', # 'Group2.Read1', 'Group2.err'] I also stuck them in the nodes menu, and got the exact same result. Two thoughts: - hasError is probably (almost certainly) not what you're after. From the help: "Error state of the node itself, regardless of the state of the ops in its input tree. Note that an error on a node may not appear *if there is an error somewhere in its input tree,* because it may not be possible to validate the node itself correctly in that case" Emphasis mine, but errors are a bit.. twitchy. The group.begin() calls help bake down the problem a little, and give you the right result (that's my hunch at work) but... - If you just want to know if the read node isn't reading I'd suggest this approach instead def unreadableFile(): groups = nuke.allNodes('Group') reads = [read for grp in groups for read in nuke.allNodes(group = grp) if read.Class() == 'Read' and not read.metadata("input/filename")] print 'withoutHasError: ', reads and ask the direct question to the Read node - what file did you read? (which is much more answerable than 'are you broken?') -Anthony On Tue, Feb 16, 2016, at 07:41 PM, Ean Carr wrote: > Hi Sören, > > I'm seeing this exact behavior and it's baffling. Nuke 9.0v7. > > Did you ever report this? Anyone else? > > Cheers Ean > > On Fri, Sep 17, 2010 at 4:11 PM, sv022 <sv...@hdm-stuttgart.de> wrote: >> Hey folks, >> >> I've came across this really weird behaviour of Nuke, when using the hasError() method of a Read node. >> >> I've got a python script that gets all read nodes of the entire nuke script, i.e. all reads from root level and all reads within groups and all of their subgroups. >> Now I want only the nodes that have no error, put them in a list and return the list, which works flawlessly... as long as I run these functions out of the Script Editor. >> >> example code of the part that collects the reads in groups: >> >> def withHasError(): >> >> groups = nuke.allNodes('Group') >> reads = [read for grp in groups for read in nuke.allNodes(group = grp) if read.Class() == 'Read' and not read.hasError()] >> print 'withHasError: ', reads >> >> def withoutHasError(): >> groups = nuke.allNodes('Group') >> reads = [read for grp in groups for read in nuke.allNodes(group = grp) if read.Class() == 'Read'] >> print 'withoutHasError: ', reads >> >> out of the Script Editor I get this: >> >> withHasError() >> withoutHasError() >> >> Result: >> withHasError: [<Read6 at 0x00000000049E8710>, <Read5 at 0x00000000049E86F0>] >> >> withoutHasError: [<Read6 at 0x00000000049E8710>, <Read5 at 0x00000000049E86F0>] >> >> >> now add these functions to the menu and run them again, you'll come to this: >> >> >> withHasError: [] >> >> withoutHasError: [<Read6 at 0x00000000049E8710>, <Read5 at 0x00000000049E86F0>] >> >> >> huh?! why is that? >> Any of you guys got a different, more reliable solution to get rid of erroneous Reads or even an explanation why this doesn't work? >> >> >> Big thanks in advance! >> cheers, Sören >> _______________________________________________ >> Nuke-python mailing list >> Nuke-python@support.thefoundry.co.uk >> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python > _________________________________________________ > Nuke-python mailing list Nuke-python@support.thefoundry.co.uk, > http://forums.thefoundry.co.uk/ > http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
_______________________________________________ Nuke-python mailing list Nuke-python@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/ http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python