vscode连接houdini 配置py开发环境(有坑)
注意这是配置外部开发工具的方法,不是表达式栏直接打开外部编辑器的方法
配置vscode自动补全
打开vscode,选择一个文件夹作为工作目录,随便建一个py文件把解释器改成houdini目录中的python解释器
我的是D:\Program Files\Side Effects Software\Houdini 18.0.499\python27\python.exe,根据自己的目录找
据说py3版houdini还有很多bug,所以我暂时还是用py2的

然后在工程目录的.vscode文件夹里打开settings.json,在其中添加如下变量
"python.autoComplete.extraPaths": [你的houdini路径\\houdini\\python2.7libs]
这个是hou package的包,另外有两个在houdini目录下的python27/lib/site-packages和python27/lib/site-packages-forced,都是hou的依赖项(其实后两个不加也行)
我添加之后setting是这样的

下面那个analysis.extraPaths变量是vscode根据自动补全路径自动添加上的,不知道是不是新功能,不用管它
现在可以随便建个py文件来来看看是否能自动补全

(我最开始添加自动补全这一步失效了,搞了好久也没发现自己操作有什么问题,最后卸载vscode重装就好使了,估计是什么插件冲突的问题,如果实在弄不出来也重装试试吧)

建立与houdini的连接
连接方式还是比较简单的,在官方文档中就有写

根据文档提示,首先在houdini中新建工具,输入
import hrpyc
hrpyc.start_server()
hou.ui.displayMessage("Service is running")

使用外部编辑器的时候先点击一下这个脚本
这个服务默认端口是18811,额外开启一个线程,想自定义端口可以在start_server函数中传入port=端口号,想使用houdini的主线程可以传入use_thread=False

然后建个py文件,先建立连接
import hrpyc
connection, hou = hrpyc.import_remote_module()
执行之后触发导入异常,因为vscode只是补全,执行时并没有把包路径放到寻找路径中,导入之前再添加两条临时路径(替换成自己的安装包目录)
※不要将hou包添加到python的全局包查找目录,原因后面有
import sys
sys.path.append(r"D:\Program Files\Side Effects Software\Houdini 18.0.499\houdini\python2.7libs")
sys.path.append(r"D:\Program Files\Side Effects Software\Houdini 18.0.499\python27\lib\site-packages")
最后是这样

运行一下,不报错了
然后在后面随便写个东西(注意此时不要导入hou)
hou.node('/obj').createNode('null', node_name='dnmd')
hou.ui.displayMessage('wdnmd')
创建一个名字是dnmd的空物体,再显示一条信息

确实连接上了,但是问题是按照文档的操作方式是没有自动补全的,官方的说法现在的hou是一个类似houdini中hou程序包的对象,这个对象是把代码发送到hython之后解析的,而并不能供我们在vscode中作为自动补全使用,如果我们import hou,hou对象会被覆盖导致代码失效
我查到可以在pycharm中添加这条无效的代码
if False:
import hou
来让程序以为hou是导入到文件的实例,但在vscode中有pylance这个交互解析插件(我认为它是挺好用),它智能地把你后面这条语句变灰并提示你这条代码是不会被执行的,所以后面的代码依然不会把hou作为包来解析帮助自动补全


但我们可以利用刚才那个导入异常来让vscode以为这条代码可能是可以执行的
try:
import hou
except ImportError:
pass

成了,但我们知道执行的时候肯定会触发导入异常然后自动忽略它的,都是些雕虫小技

然后把这些整理一下单独存为一个包叫connect_hodini或是什么的

之后要编写其他脚本只需要在这个工程目录建文件然后导入它就可以带着自动补全写了,而且写完不用做其他操作直接执行,这就很方便了

甚至不需要import hou

可惜的是经过函数返回之后的对象并不能自动解析,因为包里的方法并没指定会返回什么类型的对象,我暂时也没想到什么方法,就算用houdini里的python shell来写它一样解析不到
等py3版本完善之后有了typing标注就自然解决了

吧