欢迎光临散文网 会员登陆 & 注册

ghpython调用numpy等Cpython库的方法浅析

2023-07-09 16:29 作者:东岳整人  | 我要投稿

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

Grasshopper提供了python开发接口,但可惜的是,这里的Python是Ironpython2.7,而上述Python的库多是基于Cpython3以上,这些功能繁多的库,是无法被ghpython所直接调用的。

其实所谓的“调用”无非是数据的传递,只要明白了这个本质性问题,肯定是可以自己编程解决一些调用问题,比如我见过的alpaca4d,直接用txt文本文件来传递数据,还有的库利用socket来进行数据传递。但这些方法总是需要开发者自己编写大量的代码,而且只能针对某特定的库,那么有没有更加通用的办法呢?

本文提供一种相对较为简单易行的办法,可供ghpython调用Cpython的库,经笔者测试,除了一些较为复杂的库,大部分都可以很流畅地调用,先看效果:


调用docx生成word文档
调用PIL把图描点到犀牛中
调用vtk展示一个圆柱体


下面来讲讲实现的原理。

关键字: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的完整代码,请关注公众号“建筑结构参数化”。


ghpython调用numpy等Cpython库的方法浅析的评论 (共 条)

分享到微博请遵守国家法律