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