So I've looked around, and I've seen that Arnold currently doesn't work with Houdini 18.5 Py3 edition, and thats something I'd love to change. I've seen the answers btw, so this is my post trying to get around it all.
I originally posted this up on the Rebelway discord, but I wanted to make it here so I can get help or advice from others. I'll basically copy and paste what I said there though, so that anyone coming in can understand the steps.
Also, this is just a port to get the renderer working, not a proper port with updated methods and functions from python 2 to 3.
This currently is not a working thing, but I've gotten past a ton of different bugs, so I'm putting it here so that someone may be able to help get around it all. Currently there are two types of python modules we need to discuss. The *.py and the *.pyd files. The *.py are standard python modules, which is what we'll be editing. The *.pyd files are c compiled python dll's, optimised with the C language so that they are fast.
Anyway, there are only two things inside the .py files we need to change, and that is the
has_key functions. These are python 2 functions that have either been remade or just replaced with better ones. So inside our "Arnold" folder, we have several subfolders, those being:
arnold config docs dso otls presets python2.7libs redist scripts soho toolbar
Everything we'll be changing scriptwise will be inside the
scripts folder. I'll list out all the files that you'll need to change the
print somethingtoprinthere change it to
print(somethingtoprinthere) (so wrap it in brackets). These files include:
hipfix.py python\pythonrc.py python\htoa\conversion.py python\htoa\device.py python\htoa\license.py python\htoa\material.py python\htoa\ocio.py python\htoa\parameter.py python\htoa\session.py
Keep in mind, if there exists a duplicate name with the extension of *.pyc, delete it. Those are pre-compiled versions of the scripts we just changed, and will be run before the *.py, so all our changes will be ignored. Now, for the
has_key function. Everywhere it is, for example,
if os.environ.has_key('HTOA'):, change it to
if "HTOA" in os.environ. You make the
has_key changes to the following files:
python\pythonrc.py python\htoa\object\rop.py python\htoa\properties.py python\htoa\searchpath.py python\htoa\session.py
So that was the relatively easy part done. If I now boot up a py3 version of h18.5, some of those errors should now be gone.
So now those print and environment errors are now gone on load, lets lay down a light. And we get a nice
No module named 'psutil' This was a harder fix really, but the initial steps is to copy the folder
Arnold\python2.7libs and rename it to
Arnold\python3.7libs However, this won't fix some issues. If we dive inside the python3.7libs folder, there is another folder called "psutils", and inside there we find several *.py files and one *.pyd file. The *.pyd file is the one we need to change. If I run it now, we get past the first "no module found" error, but hit a different error saying no DLL was found. This is because the *.pyd file has been compiled for python 2.7. We need the same version compiled for 3.7. So I did some lovely googling, and grabbing of completely wrong files until I found the one I need. Since I run on a windows machine in 64bit, I needed the wheel (python install library basically) for python 3.7 amd64. After grabbing the latest version and trying it, I had to downgrade to version 5.4.8 of psutils for it to work. But installing it is easy, just grab the wheel and then go
pip install wheelfile.whl (I'll post the wheel here too, but for reference I used
psutil-5.4.8-cp37-cp37m-win_amd64.whl found here -> https://pypi.upc.edu/simple/psutil/). To grab our util, we need to navigate to where our Python3.7 is installed (our custom python that is, not the one with Houdini), where mine is installed under
C:\CustomTools\Python\Python37, and navigate to
Lib\site-packages. Depending on how much Python you do, you could have a ton of folders in here, or hardly any.
Inside our site-packages, we see two folders with "psutil" in the name.
We only want the first,
psutil Inside there we have several different files, but we mainly just want the one with the *.pyd extension, that being called
_psutil_windows.cp37-win_amd64.pyd. Simply rename it to _psutil_windows.pyd and replace the one inside
python3.7libs\utils or even better, remove the entire psutil folder from python3.7libs inside Arnold, and copy and paste the psutil folder found inside our site-packages. Now if we lay down our lights or materals, we get no errors. Great! Lets lay down a render node, aaaand another error. This time talking about how a filter object is not subscriptable. This is coming from the file
python\htoa\ocio.py. As far as I can see, in python 2 this returned a list, but in python 3, it returns an iterable (meaning it is spawned upon request, so its better for memory). Lets just turn them into a list.
So this fixes everything now, no node-laying errors or anything. The last hiccup is when I get to hitting "Render". Hick fires off, but it fails instantly. I've attached the image result of the failure.
I know this was a massive long read, so if you did read it, and noticed a bunch of spelling mistakes, this was because I copied verbatim the discord post, and only edited some small things here or there.
Thanks to anyone who replies\helps!