前沿拓展:
不是有效的win32應(yīng)用程序
提示不是有效的32應(yīng)用程序有兩種原因。
1、這個(gè)文件是不是32位的應(yīng)用程序,如果是64位的軟件是無(wú)法在32位系統(tǒng)運(yùn)行的,這個(gè)就會(huì)提示該程序不是有效的32應(yīng)用關(guān)聯(lián)性被破壞了,可能是人為或者**篡改的。
解決方環(huán)既話織法:
1、原因1的下載對(duì)應(yīng)的32位版本軟件安裝運(yùn)行即可。
2、按WIN鍵+R鍵打開(kāi)運(yùn)行窗口,輸入REGEDIT按回車(chē)鍵打開(kāi)。
最近有個(gè)項(xiàng)目需要希望可以采集華中數(shù)控系統(tǒng)的智能主軸負(fù)載并在WEB前端以波動(dòng)圖來(lái)展示負(fù)載數(shù)據(jù),這里我打算利用Vue+Echarts來(lái)構(gòu)建WEB前端展示、Python+Django來(lái)搭建WEB后臺(tái)服務(wù)、由于是實(shí)時(shí)刷新數(shù)據(jù)所以這里利用WebSocket來(lái)實(shí)現(xiàn)數(shù)據(jù)交互、最后就是實(shí)現(xiàn)華中數(shù)控的數(shù)據(jù)采集。華中提供了DLL可以用來(lái)調(diào)用,所以這里我們需要在python中來(lái)引入DLL文件。
ctypes庫(kù)
Python調(diào)用DLL需要依賴(lài)一個(gè)外部函數(shù)庫(kù)ctypes,雖然是外部函數(shù)庫(kù)但卻已在Python內(nèi)置了所以不需要單獨(dú)安裝。它提供了與 C 兼容的數(shù)據(jù)類(lèi)型并允許調(diào)用 DLL 或共享庫(kù)中的函數(shù),通過(guò)ctypes可以很方便地調(diào)用DLL中輸出的接口函數(shù)。
DLL調(diào)用方式
為什么ctypes提供了這么多種dll調(diào)用方式,因?yàn)閐ll在導(dǎo)出函數(shù)時(shí)可以聲明調(diào)用約定(stdcall或者cdecl),不同的約定方式導(dǎo)出的函數(shù)名也是不同的所以Python加載時(shí)也提供了相應(yīng)的加載函數(shù)。如果約定stdcall調(diào)用一般采用windll.LoadLibrary或者WinDLL方式調(diào)用,如果約定cdecl調(diào)用一般采用cdll.LoadLibrary或者CDLL調(diào)用(windll和cdll分別是WinDLL類(lèi)和CDll類(lèi)的對(duì)象)。
from ctypes import *
# import ctypes
# ———- ctypes調(diào)用dll的幾種方式 ———–
# dll = windll.LoadLibrary(r"./ncdevs.dll")
# dll = cdll.LoadLibrary("./ncdevs.dll")
# dll = WinDLL("./ncdevs.dll")
# dll = CDLL('./ncdevs.dll')OSError: [WinError 126] 找不到指定的模塊
在python調(diào)用dll的時(shí)候遇到錯(cuò)誤:OSError: [WinError 126] 找不到指定的模塊,這個(gè)問(wèn)題大多數(shù)都是缺少了dll或者沒(méi)有正確地引入dll。特別是當(dāng)引入的dll還依賴(lài)于其它的dll時(shí),依賴(lài)的dll也要能被Python訪問(wèn)到。
# 調(diào)用同目錄下的模塊,如:father/myself/test.py
import test 或 from test import *
# 調(diào)用同級(jí)目錄下的模塊,如:father/brother/test.py
import brother.test 或 from brother.test import *
# 調(diào)用子目錄下的模塊,子目錄必須要有 __init__.py文件。如:django/myself/child/test.py
import myself.child.test 或 from myself.child.test import *
# 調(diào)用上級(jí)目錄下的模塊,如:father/myself/test.py
import father.demo 或者 from father.demo import *OSError: [WinError 193] %1 不是有效的 Win32 應(yīng)用程序
這個(gè)問(wèn)題應(yīng)該是因?yàn)槌绦虍?dāng)前的編輯運(yùn)行環(huán)境不匹配, 因?yàn)?4位的python.exe只能調(diào)用64位的DLL,32位的python.exe 只能調(diào)用32位的DLL。如果你用64位環(huán)境下的python調(diào)用32位的DLL文件肯定是不行的,要保證環(huán)境一致(這里我的python是64位的,可是我編譯的dll默認(rèn)是32位的)。本來(lái)還想著把dll編譯成64位的呢,結(jié)果華中提供的dll也是是32位的編譯直接報(bào)錯(cuò):warning LNK4272: 庫(kù)計(jì)算機(jī)類(lèi)型“x86”與目標(biāo)計(jì)算機(jī)類(lèi)型“x64”沖突(只能安裝個(gè)32位的Python先了)。
小編綜合來(lái)說(shuō):
華中數(shù)控提供了C/C++、C#兩種二次開(kāi)發(fā)用到的API函數(shù),Python沒(méi)法直接調(diào)用這些API。所以這我還需要用C/C++調(diào)用類(lèi)庫(kù)中的方法將函數(shù)重新封裝下,第二再交給Python來(lái)處理。以上內(nèi)容是小編給大家分享的【Python實(shí)戰(zhàn)014:解決DLL動(dòng)態(tài)鏈接庫(kù)調(diào)用時(shí)遇到的問(wèn)題】。希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。
拓展知識(shí):
前沿拓展:
不是有效的win32應(yīng)用程序
提示不是有效的32應(yīng)用程序有兩種原因。
1、這個(gè)文件是不是32位的應(yīng)用程序,如果是64位的軟件是無(wú)法在32位系統(tǒng)運(yùn)行的,這個(gè)就會(huì)提示該程序不是有效的32應(yīng)用關(guān)聯(lián)性被破壞了,可能是人為或者**篡改的。
解決方環(huán)既話織法:
1、原因1的下載對(duì)應(yīng)的32位版本軟件安裝運(yùn)行即可。
2、按WIN鍵+R鍵打開(kāi)運(yùn)行窗口,輸入REGEDIT按回車(chē)鍵打開(kāi)。
最近有個(gè)項(xiàng)目需要希望可以采集華中數(shù)控系統(tǒng)的智能主軸負(fù)載并在WEB前端以波動(dòng)圖來(lái)展示負(fù)載數(shù)據(jù),這里我打算利用Vue+Echarts來(lái)構(gòu)建WEB前端展示、Python+Django來(lái)搭建WEB后臺(tái)服務(wù)、由于是實(shí)時(shí)刷新數(shù)據(jù)所以這里利用WebSocket來(lái)實(shí)現(xiàn)數(shù)據(jù)交互、最后就是實(shí)現(xiàn)華中數(shù)控的數(shù)據(jù)采集。華中提供了DLL可以用來(lái)調(diào)用,所以這里我們需要在python中來(lái)引入DLL文件。
ctypes庫(kù)
Python調(diào)用DLL需要依賴(lài)一個(gè)外部函數(shù)庫(kù)ctypes,雖然是外部函數(shù)庫(kù)但卻已在Python內(nèi)置了所以不需要單獨(dú)安裝。它提供了與 C 兼容的數(shù)據(jù)類(lèi)型并允許調(diào)用 DLL 或共享庫(kù)中的函數(shù),通過(guò)ctypes可以很方便地調(diào)用DLL中輸出的接口函數(shù)。
DLL調(diào)用方式
為什么ctypes提供了這么多種dll調(diào)用方式,因?yàn)閐ll在導(dǎo)出函數(shù)時(shí)可以聲明調(diào)用約定(stdcall或者cdecl),不同的約定方式導(dǎo)出的函數(shù)名也是不同的所以Python加載時(shí)也提供了相應(yīng)的加載函數(shù)。如果約定stdcall調(diào)用一般采用windll.LoadLibrary或者WinDLL方式調(diào)用,如果約定cdecl調(diào)用一般采用cdll.LoadLibrary或者CDLL調(diào)用(windll和cdll分別是WinDLL類(lèi)和CDll類(lèi)的對(duì)象)。
from ctypes import *
# import ctypes
# ———- ctypes調(diào)用dll的幾種方式 ———–
# dll = windll.LoadLibrary(r"./ncdevs.dll")
# dll = cdll.LoadLibrary("./ncdevs.dll")
# dll = WinDLL("./ncdevs.dll")
# dll = CDLL('./ncdevs.dll')OSError: [WinError 126] 找不到指定的模塊
在python調(diào)用dll的時(shí)候遇到錯(cuò)誤:OSError: [WinError 126] 找不到指定的模塊,這個(gè)問(wèn)題大多數(shù)都是缺少了dll或者沒(méi)有正確地引入dll。特別是當(dāng)引入的dll還依賴(lài)于其它的dll時(shí),依賴(lài)的dll也要能被Python訪問(wèn)到。
# 調(diào)用同目錄下的模塊,如:father/myself/test.py
import test 或 from test import *
# 調(diào)用同級(jí)目錄下的模塊,如:father/brother/test.py
import brother.test 或 from brother.test import *
# 調(diào)用子目錄下的模塊,子目錄必須要有 __init__.py文件。如:django/myself/child/test.py
import myself.child.test 或 from myself.child.test import *
# 調(diào)用上級(jí)目錄下的模塊,如:father/myself/test.py
import father.demo 或者 from father.demo import *OSError: [WinError 193] %1 不是有效的 Win32 應(yīng)用程序
這個(gè)問(wèn)題應(yīng)該是因?yàn)槌绦虍?dāng)前的編輯運(yùn)行環(huán)境不匹配, 因?yàn)?4位的python.exe只能調(diào)用64位的DLL,32位的python.exe 只能調(diào)用32位的DLL。如果你用64位環(huán)境下的python調(diào)用32位的DLL文件肯定是不行的,要保證環(huán)境一致(這里我的python是64位的,可是我編譯的dll默認(rèn)是32位的)。本來(lái)還想著把dll編譯成64位的呢,結(jié)果華中提供的dll也是是32位的編譯直接報(bào)錯(cuò):warning LNK4272: 庫(kù)計(jì)算機(jī)類(lèi)型“x86”與目標(biāo)計(jì)算機(jī)類(lèi)型“x64”沖突(只能安裝個(gè)32位的Python先了)。
小編綜合來(lái)說(shuō):
華中數(shù)控提供了C/C++、C#兩種二次開(kāi)發(fā)用到的API函數(shù),Python沒(méi)法直接調(diào)用這些API。所以這我還需要用C/C++調(diào)用類(lèi)庫(kù)中的方法將函數(shù)重新封裝下,第二再交給Python來(lái)處理。以上內(nèi)容是小編給大家分享的【Python實(shí)戰(zhàn)014:解決DLL動(dòng)態(tài)鏈接庫(kù)調(diào)用時(shí)遇到的問(wèn)題】。希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://xiesong.cn/19720.html