ghpython调用numpy等Cpython库的方法浅析
Python是一种简单易学却功能强悍的语言,其强悍的一个重要原因就在于,来自世界各地的开发者们为其编写了大量的库,这些库简单易用,功能涵盖广泛。不管是数据处理、视频下载编辑、爬虫、网页自动化、桌面自动化、自动化办公等,Python都有对应的库,以至于很多时候你甚至可以直接把他们当成开箱即用的小工具来用,可以说是工作中的利器。

Grasshopper提供了python开发接口,但可惜的是,这里的Python是Ironpython2.7,而上述Python的库多是基于Cpython3以上,这些功能繁多的库,是无法被ghpython所直接调用的。
其实所谓的“调用”无非是数据的传递,只要明白了这个本质性问题,肯定是可以自己编程解决一些调用问题,比如我见过的alpaca4d,直接用txt文本文件来传递数据,还有的库利用socket来进行数据传递。但这些方法总是需要开发者自己编写大量的代码,而且只能针对某特定的库,那么有没有更加通用的办法呢?
本文提供一种相对较为简单易行的办法,可供ghpython调用Cpython的库,经笔者测试,除了一些较为复杂的库,大部分都可以很流畅地调用,先看效果:



下面来讲讲实现的原理。
关键字:pythonnet。pythonnet是一个python包,致力于Python与.NET之间的无缝交互,使用它,既可以让python调用.NET,也可以让.NET调用Python。众所周知,IronPython其实就是.NET,所以自然也可利用pythonnet来调用Python。
首先在Cpython环境下pip install pythonnet,安装好后具体的使用方法可以参考pythonnet官方的说明,这里简单总计一下几处要点:
1、在系统中添加PYTHONNET_PYDLL环境变量,变量的内容为pythonxx.dll的完整路径,比如我的电脑上就是D:\Programs\Python\Python38\python38.dll
2、在代码中把Python.Runtime.dll所在路径添加到系统路径(用sys.path.append()添加)
3、输入以下代码:
clr.AddReference('Python.Runtime.dll')
from Python.Runtime import *
PythonEngine.Initialize()
4、注意所有的调用相关代码军需包含在with Py.GIL():代码块内。
5、如需调用Python包,则可用以下形式,如调用docx:
dx = Py.Import("docx")
doc=dx.Document()
doc.add_heading(“标题”,level=1) #添加标题
doc.save(r"1.docx")
做到以上几点,就可以愉快地调用Cpython包了。但这个方法也不能做到万能,比如在调用pandas的时候,我就遇到了问题,主要是数据格式似乎有问题,这个只能大家自己探索了。
以上就是ghpython调用Cpython的全部步骤,按文章应该就能做到顺利调用,如果还需要调用docx和PIL的完整代码,请关注公众号“建筑结构参数化”。