ghpython調(diào)用numpy等Cpython庫的方法淺析
Python是一種簡單易學(xué)卻功能強(qiáng)悍的語言,其強(qiáng)悍的一個(gè)重要原因就在于,來自世界各地的開發(fā)者們?yōu)槠渚帉懥舜罅康膸欤@些庫簡單易用,功能涵蓋廣泛。不管是數(shù)據(jù)處理、視頻下載編輯、爬蟲、網(wǎng)頁自動化、桌面自動化、自動化辦公等,Python都有對應(yīng)的庫,以至于很多時(shí)候你甚至可以直接把他們當(dāng)成開箱即用的小工具來用,可以說是工作中的利器。

Grasshopper提供了python開發(fā)接口,但可惜的是,這里的Python是Ironpython2.7,而上述Python的庫多是基于Cpython3以上,這些功能繁多的庫,是無法被ghpython所直接調(diào)用的。
其實(shí)所謂的“調(diào)用”無非是數(shù)據(jù)的傳遞,只要明白了這個(gè)本質(zhì)性問題,肯定是可以自己編程解決一些調(diào)用問題,比如我見過的alpaca4d,直接用txt文本文件來傳遞數(shù)據(jù),還有的庫利用socket來進(jìn)行數(shù)據(jù)傳遞。但這些方法總是需要開發(fā)者自己編寫大量的代碼,而且只能針對某特定的庫,那么有沒有更加通用的辦法呢?
本文提供一種相對較為簡單易行的辦法,可供ghpython調(diào)用Cpython的庫,經(jīng)筆者測試,除了一些較為復(fù)雜的庫,大部分都可以很流暢地調(diào)用,先看效果:



下面來講講實(shí)現(xiàn)的原理。
關(guān)鍵字:pythonnet。pythonnet是一個(gè)python包,致力于Python與.NET之間的無縫交互,使用它,既可以讓python調(diào)用.NET,也可以讓.NET調(diào)用Python。眾所周知,IronPython其實(shí)就是.NET,所以自然也可利用pythonnet來調(diào)用Python。
首先在Cpython環(huán)境下pip install pythonnet,安裝好后具體的使用方法可以參考pythonnet官方的說明,這里簡單總計(jì)一下幾處要點(diǎn):
1、在系統(tǒng)中添加PYTHONNET_PYDLL環(huán)境變量,變量的內(nèi)容為pythonxx.dll的完整路徑,比如我的電腦上就是D:\Programs\Python\Python38\python38.dll
2、在代碼中把Python.Runtime.dll所在路徑添加到系統(tǒng)路徑(用sys.path.append()添加)
3、輸入以下代碼:
clr.AddReference('Python.Runtime.dll')
from Python.Runtime import *
PythonEngine.Initialize()
4、注意所有的調(diào)用相關(guān)代碼軍需包含在with Py.GIL():代碼塊內(nèi)。
5、如需調(diào)用Python包,則可用以下形式,如調(diào)用docx:
dx = Py.Import("docx")
doc=dx.Document()
doc.add_heading(“標(biāo)題”,level=1)???? #添加標(biāo)題
doc.save(r"1.docx")
做到以上幾點(diǎn),就可以愉快地調(diào)用Cpython包了。但這個(gè)方法也不能做到萬能,比如在調(diào)用pandas的時(shí)候,我就遇到了問題,主要是數(shù)據(jù)格式似乎有問題,這個(gè)只能大家自己探索了。
以上就是ghpython調(diào)用Cpython的全部步驟,按文章應(yīng)該就能做到順利調(diào)用,如果還需要調(diào)用docx和PIL的完整代碼,請關(guān)注公眾號“建筑結(jié)構(gòu)參數(shù)化”。