vscode連接houdini 配置py開發(fā)環(huán)境(有坑)
注意這是配置外部開發(fā)工具的方法,不是表達式欄直接打開外部編輯器的方法
配置vscode自動補全
打開vscode,選擇一個文件夾作為工作目錄,隨便建一個py文件把解釋器改成houdini目錄中的python解釋器
我的是D:\Program Files\Side Effects Software\Houdini 18.0.499\python27\python.exe,根據(jù)自己的目錄找
據(jù)說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根據(jù)自動補全路徑自動添加上的,不知道是不是新功能,不用管它
現(xiàn)在可以隨便建個py文件來來看看是否能自動補全

(我最開始添加自動補全這一步失效了,搞了好久也沒發(fā)現(xiàn)自己操作有什么問題,最后卸載vscode重裝就好使了,估計是什么插件沖突的問題,如果實在弄不出來也重裝試試吧)

建立與houdini的連接
連接方式還是比較簡單的,在官方文檔中就有寫

根據(jù)文檔提示,首先在houdini中新建工具,輸入
import hrpyc
hrpyc.start_server()
hou.ui.displayMessage("Service is running")

使用外部編輯器的時候先點擊一下這個腳本
這個服務(wù)默認端口是18811,額外開啟一個線程,想自定義端口可以在start_server函數(shù)中傳入port=端口號,想使用houdini的主線程可以傳入use_thread=False

然后建個py文件,先建立連接
import?hrpyc
connection,?hou?=?hrpyc.import_remote_module()
執(zhí)行之后觸發(fā)導(dǎo)入異常,因為vscode只是補全,執(zhí)行時并沒有把包路徑放到尋找路徑中,導(dǎo)入之前再添加兩條臨時路徑(替換成自己的安裝包目錄)
※不要將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")
最后是這樣

運行一下,不報錯了
然后在后面隨便寫個東西(注意此時不要導(dǎo)入hou)
hou.node('/obj').createNode('null',?node_name='dnmd')
hou.ui.displayMessage('wdnmd')
創(chuàng)建一個名字是dnmd的空物體,再顯示一條信息

確實連接上了,但是問題是按照文檔的操作方式是沒有自動補全的,官方的說法現(xiàn)在的hou是一個類似houdini中hou程序包的對象,這個對象是把代碼發(fā)送到hython之后解析的,而并不能供我們在vscode中作為自動補全使用,如果我們import hou,hou對象會被覆蓋導(dǎo)致代碼失效
我查到可以在pycharm中添加這條無效的代碼
if False:
????import hou
來讓程序以為hou是導(dǎo)入到文件的實例,但在vscode中有pylance這個交互解析插件(我認為它是挺好用),它智能地把你后面這條語句變灰并提示你這條代碼是不會被執(zhí)行的,所以后面的代碼依然不會把hou作為包來解析幫助自動補全


但我們可以利用剛才那個導(dǎo)入異常來讓vscode以為這條代碼可能是可以執(zhí)行的
try:
????import?hou
except?ImportError:
????pass

成了,但我們知道執(zhí)行的時候肯定會觸發(fā)導(dǎo)入異常然后自動忽略它的,都是些雕蟲小技

然后把這些整理一下單獨存為一個包叫connect_hodini或是什么的

之后要編寫其他腳本只需要在這個工程目錄建文件然后導(dǎo)入它就可以帶著自動補全寫了,而且寫完不用做其他操作直接執(zhí)行,這就很方便了

甚至不需要import hou

可惜的是經(jīng)過函數(shù)返回之后的對象并不能自動解析,因為包里的方法并沒指定會返回什么類型的對象,我暫時也沒想到什么方法,就算用houdini里的python shell來寫它一樣解析不到
等py3版本完善之后有了typing標(biāo)注就自然解決了

吧