Jaki jest najłatwiejszy sposób korzystania z DLL
pliku od wewnątrz Python
?
W szczególności, w jaki sposób można tego dokonać bez pisania dodatkowego C++
kodu opakowania, w którym można by udostępnić funkcjonalność Python
?
Natywna Python
funkcjonalność jest zdecydowanie lepsza niż korzystanie z biblioteki innej firmy.
Odpowiedzi:
Dla ułatwienia użytkowania ctypes jest właściwą drogą.
Poniższy przykład ctypów pochodzi z faktycznego kodu, który napisałem (w Pythonie 2.5). To zdecydowanie najłatwiejszy sposób, w jaki znalazłem robienie tego, o co prosisz.
ctypes
Materiał posiada typach danych typu C (int
,char
,short
,void*
, i tak dalej), może przechodzić przez wartość lub odniesienia. Może także zwracać określone typy danych, chociaż mój przykład tego nie robi (interfejs API HLL zwraca wartości poprzez modyfikację zmiennej przekazywanej przez referencję).Jeśli chodzi o konkretny przykład pokazany powyżej, interfejs EHLLAPI firmy IBM jest dość spójnym interfejsem.
Wszystkie wywołania przekazują cztery puste wskaźniki (EHLLAPI wysyła kod powrotu z powrotem przez czwarty parametr, wskaźnik do
int
tak, podczas gdy określamint
jako typ zwracany, mogę go bezpiecznie zignorować) zgodnie z dokumentacją IBM tutaj . Innymi słowy, wariantem C funkcji byłoby:To sprawia, że jedna, prosta
ctypes
funkcja jest w stanie zrobić wszystko, co zapewnia biblioteka EHLLAPI, ale prawdopodobne jest, że inne biblioteki będą wymagały osobnejctypes
konfiguracji dla każdej funkcji biblioteki.Zwracana wartość z
WINFUNCTYPE
jest prototypem funkcji, ale nadal musisz skonfigurować więcej informacji o parametrach (ponad typami). Każda krotkahllApiParams
ma parametr „kierunek” (1 = wejście, 2 = wyjście itd.), Nazwę parametru i wartość domyślną -ctypes
szczegółowe informacje można znaleźć w dokumentacji docoPo uzyskaniu informacji o prototypie i parametrach można utworzyć „wywoływalny” język Python, za
hllApi
pomocą którego można wywołać funkcję. Wystarczy stworzyć niezbędną zmienną (p1
poprzezp4
w moim przypadku) i wywołać funkcję z nimi.źródło
hllApiParams
? Jaki jest sens tych krotek? Trudno jest dopasować niektóre elementy w tym przykładzie do dokumentacji.Ta strona zawiera bardzo prosty przykład wywoływania funkcji z pliku DLL.
Parafrazując szczegóły tutaj dla kompletności:
źródło
ctypów można użyć do uzyskania dostępu do bibliotek DLL, oto samouczek:
http://docs.python.org/library/ctypes.html#module-ctypes
źródło
Może z
Dispatch
:Gdzie zkemkeeper jest zarejestrowanym plikiem DLL w systemie ... Następnie możesz uzyskać dostęp do funkcji, wywołując je:
źródło
Budowanie biblioteki DLL i łączenie jej w Pythonie za pomocą ctypes
Przedstawiam w pełni sprawny przykład, w jaki sposób budowanie
shared library
i używanie goPython
za pomocąctypes
. Rozważam tęWindows
sprawę i zajmuję się niąDLLs
. Potrzebne są dwa kroki:Udostępniona biblioteka
shared library
Uważam jest następujący i jest zawarty wtestDLL.cpp
pliku. Jedyna funkcjatestDLL
właśnie odbieraint
i drukuje ją.Budowanie biblioteki DLL z wiersza polecenia
Aby zbudować za
DLL
pomocąVisual Studio
z linii poleceń, uruchomustawić ścieżkę dołączania, a następnie uruchomić
zbudować DLL.
Budowanie
DLL
z IDEAlternatywnie
DLL
można zbudowaćVisual Studio
w następujący sposób:Łączenie biblioteki DLL w Pythonie
W obszarze Python wykonaj następujące czynności
źródło
ctypy będą najłatwiejszą w użyciu, ale (złe) użycie powoduje, że Python ulega awarii. Jeśli próbujesz zrobić coś szybko i jesteś ostrożny, to świetnie.
Zachęcam do sprawdzenia Boost Python . Tak, wymaga napisania kodu C ++ i posiadania kompilatora C ++, ale tak naprawdę nie trzeba uczyć się C ++, aby z niego korzystać, i można uzyskać darmowy (jak w piwie) kompilator C ++ od Microsoft .
źródło
Jeśli biblioteka DLL jest typu COM, możesz użyć pythonnet.
Następnie w kodzie python wypróbuj następujące rozwiązania
następnie utwórz obiekt zgodnie z klasą w bibliotece DLL i uzyskaj dostęp do metod w nim zawartych.
źródło