Python调用.NET库的方法步骤


Posted in Python onDecember 27, 2019

开发背景是这样的:整个项目中使用很多台摩托罗拉的RFID读卡器,我要为这些读卡器写一个管理程序,判断是否有RFID标签进入或离开某个区域。用户提供给我的,除了设备,就是一个.net的动态库文件。

经朋友指点,安装了.NET Framework 4.0和IronPython 2.7之后,终于可以调用.net库了。我不确定的是,python环境下那些打包工具是否还是使用,因为脚本要在IronPython的解释器ipy.exe中运行——这是后话,需要在以后的应用中去实践。先说说实际应用中的稀奇古怪的问题吧。

我的核心任务有两个:读RFID标签、读写GPIO端口。前者相对简单,操作过程也非常顺利。后者就屡屡碰壁,到现在也没有彻底解决。

C#读GPIO端口的代码是这样的:

IOPinStatus[] inputPinsStatus = null;
IOPinStatus[] outputPinsStatus = null;
Reader.GetIOStatus(out inputPinsStatus,out outputPinsStatus);

inputPinsStatus[i].pinStatus就是输入端口的状态,这是一个布尔型的变量。

IronPython需要先构造两个变量inputPinsStatus和outputPinsStatus,然后再调用GetIOStatus方法:

inputPinsStatus = clr.Reference[Array[bool]](())
outputPinsStatus = clr.Reference[Array[bool]](())
Reader.GetIOStatus(inputPinsStatus, outputPinsStatus)

inputPinsStatus是不能遍历的,必须使用inputPinsStatus.Value才可以。

C#写GPIO端口的代码是这样的(端口0写True):

IOPinStatus[] selectedOutPins = null;
selectedOutPins = new IOPinStatus[6];
selectedOutPins[0].pin = IOPins.PIN_0;
selectedOutPins[0].pinStatus = True;
Reader.SetOutputStatus(selectedOutPins);

IronPython代码是这样的:

outForSet = Array.CreateInstance(IOPinStatus, 6)
IOPinStatus.pin.SetValue(outForSet[0], IOPins.PIN_0)
IOPinStatus.pinStatus.SetValue(outForSet[0], True)
Reader.SetOutputStatus(outForSet)

这时,蹊跷事儿出现了:代码可以顺利执行,没有提示语法错误,设备也没有相应的动作!检查SetValue的结果,的确没有生效。本来这一句最初是这样写的:

outForSet[0].pinStatus = True

但系统提示:RuntimeWarning: Setting field Field on value type IOPinStatus may result in updating a copy. Use IOPinStatus.pinStatus.SetValue(instance, value) if this is safe. For more information help(IOPinStatus.pinStatus.SetValue).

改用SetValue之后,却好比对牛弹琴,什么反应也没有了。强烈郁闷中。。。

冥思苦想了一天之后,我发现了IOPinStatus的原型函数:

print IOPinStatus.__doc__
IOPinStatus(pin: IOPins, pinStatus: bool)

既然无法直接给变量的pin和pinStatus赋值,那么重新构造一个变量是否可行呢?

outForSet = Array.CreateInstance(IOPinStatus, 6)
outForSet[0] = IOPinStatus(IOPins.PIN_0, True)
... ...
Reader.SetOutputStatus(outForSet)

终于成功了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
Python通过websocket与js客户端通信示例分析
Jun 25 Python
python开启多个子进程并行运行的方法
Apr 18 Python
python实现的正则表达式功能入门教程【经典】
Jun 05 Python
python3实现磁盘空间监控
Jun 21 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
浅谈python新式类和旧式类区别
Apr 26 Python
Django实现跨域请求过程详解
Jul 25 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
python 实现客户端与服务端的通信
Dec 23 Python
IronPython连接MySQL的方法步骤
Dec 27 #Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 #Python
python3获取文件中url内容并下载代码实例
Dec 27 #Python
用python拟合等角螺线的实现示例
Dec 27 #Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 #Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 #Python
python装饰器相当于函数的调用方式
Dec 27 #Python
You might like
乱谈我对耳机、音箱的感受
2021/03/02 无线电
php 调试利器debug_print_backtrace()
2012/07/23 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
python与字符编码问题
2019/05/24 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
《手指教学》反思
2014/02/14 职场文书
社区工作感言
2014/02/21 职场文书
ktv筹备计划书
2014/05/03 职场文书
员工培训协议书
2014/09/15 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
典型事迹材料范文
2014/12/29 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers