Hey guys!
I've been fooling around with TOPS over the last week and in doing so I've encountered an issue with the python script node. Due note that this is (almost) 100% due to my lack of experience with python as a coding language.
I am having an issue creating a reference to the current python script node running. When making a python node in SOP I am sued to being able to run hou.node('.') or hou.pwd() to get a reference to the current python script node and from there being able to get to the parent node or any other node in the node tree and their parameters. However if I run hou.node('.') or hou.pwd() all I get in TOPS is a simple ‘/’ when I print it instead of the expected path to the node.
I've noticed that in the python script node there is a built in variable ‘self’ but I have not been able to get that to give me any useful results or use it with any of the hou.Node.TOPNode specific commands in the documentation.
Is there something really obvious I am missing? I noticed that there was multiple python nodes, would a different one be better? All I am looking to do is execute a few lines of python after a cache is done running.
Thanks for the read!
How to create referance to self in the python script node
5060 7 0- underscoreus
- Member
- 24 posts
- Joined: July 2017
- Offline
- tpetrick
- Staff
- 596 posts
- Joined: May 2014
- Offline
Which version of Houdini are you using?
In a Python Script node, you should be able to run hou.node('.'), assuming your Python Script is configured to “Evaluate In Process”. If it's not, the script is run in a separate child process and won't have access to anything in the .hip file.
The self variable is a reference to the underlying PDG node. It gives you a reference to one of these: https://www.sidefx.com/docs/houdini/tops/pdg/Node.html. [www.sidefx.com] The work_item variable gives you access to the work item that is evaluating: https://www.sidefx.com/docs/houdini/tops/pdg/WorkItem.html [www.sidefx.com]
Each TOP node owns a single PDG node, and it's the PDG nodes that are actually doing most of the work when the graph is evaluating. For example, parameters should be evaluated through the PDG node since it configures a context that ensures the correct local state is available:
In a Python Script node, you should be able to run hou.node('.'), assuming your Python Script is configured to “Evaluate In Process”. If it's not, the script is run in a separate child process and won't have access to anything in the .hip file.
The self variable is a reference to the underlying PDG node. It gives you a reference to one of these: https://www.sidefx.com/docs/houdini/tops/pdg/Node.html. [www.sidefx.com] The work_item variable gives you access to the work item that is evaluating: https://www.sidefx.com/docs/houdini/tops/pdg/WorkItem.html [www.sidefx.com]
Each TOP node owns a single PDG node, and it's the PDG nodes that are actually doing most of the work when the graph is evaluating. For example, parameters should be evaluated through the PDG node since it configures a context that ensures the correct local state is available:
value = self['myparm'].evaluateInt(work_item) work_item.setIntAttrib('example_data', value)
- underscoreus
- Member
- 24 posts
- Joined: July 2017
- Offline
Hi tpetrick, thanks for the reply! And thanks for the tips on how I could use the self and work-item variables!
I'm currently running Houdini 17.5 (been working with a few sub-versions but the screenshots below are from 17.5.327).
So first of all a thing I forgot to add to the original question, is it normal to have to import the hou module into the TOPS python script node? Because if I don't I get the error “name hou is not defined”, whilst in SOP, OBJ and the python shell this is never needed, it automatically has the hou module available.
Over to the issue at hand, I do indeed have the ‘Evaluate in Process’checkbox checked. However when I try to print the result of storing a hou.node('.') call in a variable, all I get shown in the console is a simple ‘/’ as if it did not find anything.
See the images attached.
I'm currently running Houdini 17.5 (been working with a few sub-versions but the screenshots below are from 17.5.327).
So first of all a thing I forgot to add to the original question, is it normal to have to import the hou module into the TOPS python script node? Because if I don't I get the error “name hou is not defined”, whilst in SOP, OBJ and the python shell this is never needed, it automatically has the hou module available.
Over to the issue at hand, I do indeed have the ‘Evaluate in Process’checkbox checked. However when I try to print the result of storing a hou.node('.') call in a variable, all I get shown in the console is a simple ‘/’ as if it did not find anything.
See the images attached.
Edited by underscoreus - March 16, 2020 22:25:28
- tpetrick
- Staff
- 596 posts
- Joined: May 2014
- Offline
Yes, you need to import hou manually. This is partly because the Python Script can be configured to run its work items out of process using Python, possibly even on the farm with a machine that doesn't have Houdini installed. Also, the script code is running inside of PDG's evaluation context which also doesn't import hou.
It looks like the change to make hou.pwd and hou.node work properly from the script was only made in 18.0, and not backported to 17.5. I can look into backporting those changes, but in the mean time you should be able to use the following to get a reference to the TOP node. When create from TOPS, a PDG node will have it's parent TOP node id set as its customId:
It looks like the change to make hou.pwd and hou.node work properly from the script was only made in 18.0, and not backported to 17.5. I can look into backporting those changes, but in the mean time you should be able to use the following to get a reference to the TOP node. When create from TOPS, a PDG node will have it's parent TOP node id set as its customId:
import hou node = hou.nodeBySessionId(self.customId) print(node)
- underscoreus
- Member
- 24 posts
- Joined: July 2017
- Offline
- tpetrick
- Staff
- 596 posts
- Joined: May 2014
- Offline
- hopen_andreas
- Member
- 2 posts
- Joined: Sept. 2023
- Offline
Hey, just found this as I have similar issues. I have no issues running the python node "generate" or in "in-process" however "out-of-process" and "services" are not working for me.
The error I'm getting is either:
"NameError: name 'self' is not defined" which is by running the code provided by @tpetric:
This code is also not giving me the result I was expecting:
print:
Running Houdini 20.0.547 with PID 13732
None
Which explains why hou.parm("name_of_ui_element").eval()
is not working.
Any suggestions to why this is not working?
Thanks
The error I'm getting is either:
"NameError: name 'self' is not defined" which is by running the code provided by @tpetric:
import hou node = hou.nodeBySessionId(self.customId) print(node)
This code is also not giving me the result I was expecting:
import hou node = hou.pwd().parent() print(node)
print:
Running Houdini 20.0.547 with PID 13732
None
Which explains why hou.parm("name_of_ui_element").eval()
is not working.
Any suggestions to why this is not working?
Thanks
- tpetrick
- Staff
- 596 posts
- Joined: May 2014
- Offline
-
- Quick Links