Python調(diào)用.NET庫(kù)的方法步驟
開(kāi)發(fā)背景是這樣的:整個(gè)項(xiàng)目中使用很多臺(tái)摩托羅拉的RFID讀卡器,我要為這些讀卡器寫(xiě)一個(gè)管理程序,判斷是否有RFID標(biāo)簽進(jìn)入或離開(kāi)某個(gè)區(qū)域。用戶提供給我的,除了設(shè)備,就是一個(gè).net的動(dòng)態(tài)庫(kù)文件。
經(jīng)朋友指點(diǎn),安裝了.NET Framework 4.0和IronPython 2.7之后,終于可以調(diào)用.net庫(kù)了。我不確定的是,python環(huán)境下那些打包工具是否還是使用,因?yàn)槟_本要在IronPython的解釋器ipy.exe中運(yùn)行——這是后話,需要在以后的應(yīng)用中去實(shí)踐。先說(shuō)說(shuō)實(shí)際應(yīng)用中的稀奇古怪的問(wèn)題吧。
我的核心任務(wù)有兩個(gè):讀RFID標(biāo)簽、讀寫(xiě)GPIO端口。前者相對(duì)簡(jiǎn)單,操作過(guò)程也非常順利。后者就屢屢碰壁,到現(xiàn)在也沒(méi)有徹底解決。
C#讀GPIO端口的代碼是這樣的:
IOPinStatus[] inputPinsStatus = null; IOPinStatus[] outputPinsStatus = null; Reader.GetIOStatus(out inputPinsStatus,out outputPinsStatus);
inputPinsStatus[i].pinStatus就是輸入端口的狀態(tài),這是一個(gè)布爾型的變量。
IronPython需要先構(gòu)造兩個(gè)變量inputPinsStatus和outputPinsStatus,然后再調(diào)用GetIOStatus方法:
inputPinsStatus = clr.Reference[Array[bool]](()) outputPinsStatus = clr.Reference[Array[bool]](()) Reader.GetIOStatus(inputPinsStatus, outputPinsStatus)
inputPinsStatus是不能遍歷的,必須使用inputPinsStatus.Value才可以。
C#寫(xiě)GPIO端口的代碼是這樣的(端口0寫(xiě)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)
這時(shí),蹊蹺事兒出現(xiàn)了:代碼可以順利執(zhí)行,沒(méi)有提示語(yǔ)法錯(cuò)誤,設(shè)備也沒(méi)有相應(yīng)的動(dòng)作!檢查SetValue的結(jié)果,的確沒(méi)有生效。本來(lái)這一句最初是這樣寫(xiě)的:
outForSet[0].pinStatus = True
但系統(tǒng)提示: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之后,卻好比對(duì)牛彈琴,什么反應(yīng)也沒(méi)有了。強(qiáng)烈郁悶中。。。
冥思苦想了一天之后,我發(fā)現(xiàn)了IOPinStatus的原型函數(shù):
print IOPinStatus.__doc__ IOPinStatus(pin: IOPins, pinStatus: bool)
既然無(wú)法直接給變量的pin和pinStatus賦值,那么重新構(gòu)造一個(gè)變量是否可行呢?
outForSet = Array.CreateInstance(IOPinStatus, 6) outForSet[0] = IOPinStatus(IOPins.PIN_0, True) ... ... Reader.SetOutputStatus(outForSet)
終于成功了!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 如何基于pythonnet調(diào)用halcon腳本
- 如何不用安裝python就能在.NET里調(diào)用Python庫(kù)
- python調(diào)用動(dòng)態(tài)鏈接庫(kù)的基本過(guò)程詳解
- ubuntu中python調(diào)用C/C++方法之動(dòng)態(tài)鏈接庫(kù)詳解
- linux中使用boost.python調(diào)用c++動(dòng)態(tài)庫(kù)的方法
- Python在Windows和在Linux下調(diào)用動(dòng)態(tài)鏈接庫(kù)的教程
- Python調(diào)用C/C++動(dòng)態(tài)鏈接庫(kù)的方法詳解
- Python 調(diào)用VC++的動(dòng)態(tài)鏈接庫(kù)(DLL)
- Python調(diào)用.net動(dòng)態(tài)庫(kù)實(shí)現(xiàn)過(guò)程解析
相關(guān)文章
numpy如何按條件給元素賦值np.where、np.clip
這篇文章主要介紹了numpy如何按條件給元素賦值np.where、np.clip問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06python使用scapy模塊實(shí)現(xiàn)ARP掃描的過(guò)程
這篇文章主要介紹了python使用scapy模塊實(shí)現(xiàn)ARP掃描的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Python實(shí)現(xiàn)從網(wǎng)絡(luò)攝像頭拉流的方法分享
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)從網(wǎng)絡(luò)攝像頭拉流的幾種方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-01-01opencv 圖像加法與圖像融合的實(shí)現(xiàn)代碼
這篇文章主要介紹了opencv 圖像加法與圖像融合的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07python spilt()分隔字符串的實(shí)現(xiàn)示例
split() 方法可以實(shí)現(xiàn)將一個(gè)字符串按照指定的分隔符切分成多個(gè)子串,本文介紹了spilt的具體使用,感興趣的可以了解一下2021-05-05Python連接MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)單便捷方法
在數(shù)據(jù)分析過(guò)程中往往要操作較大的數(shù)據(jù)集,這就需要連接數(shù)據(jù)庫(kù)進(jìn)行操作,下面這篇文章主要給大家介紹了關(guān)于Python連接MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)單便捷方法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04