通用情況下,沒有什麼好辦法能把python編譯成dll,因為python是解釋型語言,dll是編譯後的二進制文件,2者不在一個次元。除非你把python的解釋器也打包進你的工程,並在你的exe里調用。
但某些特殊情況下,也有把python的代碼編譯成dll文件的方法,在.net環境下,可以用IronPython這個工具,它可以把python代碼編譯成dll。
B. python安裝 win7。 缺失dll 文件
用下我這個試下,我在這機器上安裝正常運行。裡面除了python外還有一些庫,還有安裝教程。
C. python調dll里的類,例如dll中有類cobject,類方法add,怎麼調這個類方法呢
首先要把類操作用c語言包裝一遍,再用python的API包裝一個模塊出來(以上兩個都是c,不是c++),編譯的時候編譯成特殊的動態鏈接庫,在python裡面import當成普通模塊調用
具體太復雜,自己找教程和api吧
D. python裡面如何釋放DLL文件
調用dll的代碼採用如下順序:
dll = CDLL(dllPath)
update_out = UpdateParamStruct()
dll.SeUpdaterGetParam(case.updateType, byref(update_out))
win32api.FreeLibrary(dll._handle)
這樣就可以在執行完後,dll文件不會處於佔用的狀態了~
E. python 能用來寫動態鏈接庫(dll文件)嗎
python可以調到動態連接庫,但不能編寫編譯出動態鏈接庫,底層的東西,還是用c++寫吧
F. python 調用DLL的問題
那就是有內存泄露。內存沒有釋放。原因可能是多種。一種是你的DLL或者是AntiVC出了錯。另外一種是ctypes出錯。其中返回的內容沒有釋放內存。也許只有10個位元組,但是長期積累還是很可觀。
如果解決這個問題,就是穩定的程序,怎麼用都不會壞。
還有一個保守的辦法。如果你調用DLL的頻率不是特別快。比如每秒不超過2000次。那麼你可以將這個功能封裝在一個服務進程里。線程再通過介面去訪問。該 服務進程即使內存溢出崩潰了。也會自動重新啟動。這樣你的20個線程基本上只需要重試幾次,等服務進程重新啟動完成後,就可以獲得結果。基本不影響使用。操作系統也很安全。因為進程退出後,所有的遺留錯誤都會清空。
G. python調用外部C#庫的dll文件
importclr
importSystem
clr.AddReferenceToFile("SimpleHash.dll")
fromCommonimport*
classHashPy(SimpleHash):
def__init__(self):
pass
defHashCalc(self,arg1,arg2):
#strtobyte[]
arg1=System.Text.Encoding.Default.GetBytes(arg1)
arg2=System.Text.Encoding.Default.GetBytes(arg2)
returnSimpleHash.HashCalc(self,arg1,arg2)
audiobuff='
12345678
12345678
'
key='12345678'
printHashPy().HashCalc(audiobuff,key)
python ctype只能調用c/c++. 你要調用c#的dll 要用IronPython。如上面的例子
H. python調用dll中的函數時報錯
似乎代碼里沒有看到你沒有載入DLL啊。
另外你在c里直接改寫python的內存可能不太妥當。通常是在C里構造後,再返回到python里去。
從你的程序上看,調用完Thin後,你的變數p似乎變成了空指針。
ctypes調用DLL通常都是別人做好的DLL,沒有辦法才自己去調用。這里有好多麻煩事情。
如果是自己寫代碼,通常會建議你用cython這個模塊。很容易就實現介面。你也不用擔心這些變數類型與介面封裝的問題。
另外我印象中dll似乎與編譯器也有關系。用VC可能容易些。用BC,或者是GCC就麻煩些。
另外還有版本的問題,64位與32位不能通用。
原則上講,你這種用法,也不是不可以,可能還是哪個地方沒有弄對。比如編譯參數。你可以試試用return type把數據帶回來。而不是用指針寫內存。
因為p目前按理它是常量,很有可能調用機制中,不會讓你改寫它。
I. 我現在想把自己寫的python模塊源代碼封裝成dll,然後在別的python腳本里調用,可以嗎
可以的,只要把python模塊轉換成dll模塊,利用Python自帶的ctypes模塊載入調用就行。
ctypes 是Python的外部函數庫。它提供了與 C語言兼容的數據類型,並允許調用 DLL 或共享庫中的函數。可使用該模塊以純 Python 形式對這些庫進行封裝。
ctypes導出了cdll對象,在 Windows 系統中還導出了windll和oledll對象用於載入動態鏈接庫。通過操作這些對象的屬性,你可以載入外部的動態鏈接庫。cdll載入按標準的cdecl調用協議導出的函數,而windll導入的庫按stdcall調用協議調用其中的函數。
(9)pythondll擴展閱讀:
載入調用DLL的相關方法:
1、載入DLL
載入的時候要根據你將要調用的函數是符合什麼調用約定的。
stdcall調用約定:兩種載入方式
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
cdecl調用約定:也有兩種載入方式
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
其實windll和cdll分別是WinDLL類和CDll類的對象。
2、調用dll中的方法
載入dll的時候會返回一個DLL對象(假設名字叫Objdll),利用該對象就可以調用dll中的方法。 e.g.如果dll中有個方法名字叫Add(注意如果經過stdcall聲明的方法,如果不是用def文件聲明的導出函數或者extern 「C」 聲明的話,編譯器會對函數名進行修改,這個要注意。)
調用:nRet = Objdll.Add(12, 15) 即完成一次調用。
J. 怎樣用python調用dll
可以的,python中一般有兩種方法調用DLL中的函數。1.直接使用函數名,函數名可以用dependencywalker等工具查看。(這個工具在vc或者vs的工具包中)[python]viewplainimportctypesdll=CTYPES.CDLL("test.dll")res=test(3,4)2.使用Ordinal,Ordinal可以用dependencywalker等工具查看。[python]viewplainimportctypesdll=CTYPES.CDLL("test.dll")res=dll[1](3,4)