Mam zadanie "zawijania" biblioteki ac w klasę Pythona. Dokumentacja jest niesamowicie niejasna w tej sprawie. Wygląda na to, że oczekują, że tylko zaawansowani użytkownicy Pythona zaimplementują ctypes. Cóż, jestem początkującym w Pythonie i potrzebuję pomocy.
Jakaś pomoc krok po kroku byłaby cudowna.
Więc mam swoją bibliotekę C. Co ja robię? Jakie pliki mam gdzie umieścić? Jak zaimportować bibliotekę? Czytałem, że może istnieć sposób na „automatyczne zawijanie” do Pythona?
(Swoją drogą, zrobiłem samouczek ctypes na python.net i to nie działa. Oznacza to, że myślę, że zakładają, że powinienem być w stanie wykonać pozostałe kroki.
W rzeczywistości jest to błąd, który otrzymuję z ich kodem:
File "importtest.py", line 1
>>> from ctypes import *
SyntaxError: invalid syntax
Naprawdę przydałaby mi się pomoc krok po kroku! Dzięki ~
python
python-3.x
ctypes
spędzony
źródło
źródło
>>>
plik importtest.py? Kiedy ludzie wysyłają kod, który ma>>>
w każdym wierszu, oznacza to, że jest on uruchamiany w powłoce interaktywnej. Aby uruchomić go z pliku, usuń>>>
(to jest 3> znaki i spacja), gdziekolwiek się pojawi.>>>
s. Są one drukowane przez interaktywną powłokę i powinny zostać pominięte w pliku źródłowym.>>>
w pliku .py! AUĆ! Nigdy wcześniej tego nie widziałem!Odpowiedzi:
Oto szybki i brudny samouczek dotyczący ctypów.
Najpierw napisz swoją bibliotekę C. Oto prosty przykład Hello world:
testlib.c
Teraz skompiluj go jako bibliotekę współdzieloną ( poprawkę mac można znaleźć tutaj ):
Następnie napisz opakowanie używając ctypes:
testlibwrapper.py
Teraz wykonaj to:
Powinieneś zobaczyć wynik
Jeśli masz już na myśli bibliotekę, możesz pominąć nie-pythonową część samouczka. Upewnij się, że ctypes mogą znaleźć bibliotekę, umieszczając ją w
/usr/lib
lub innym standardowym katalogu. Jeśli to zrobisz, nie musisz określać pełnej ścieżki podczas pisania opakowania. Jeśli zdecydujesz się tego nie robić, podczas dzwonienia musisz podać pełną ścieżkę do bibliotekictypes.CDLL()
.To nie jest miejsce na bardziej kompleksowy samouczek, ale jeśli poprosisz o pomoc w przypadku konkretnych problemów na tej stronie, jestem pewien, że społeczność Ci pomoże.
PS: Zakładam, że używasz Linuksa, ponieważ używałeś
ctypes.CDLL('libc.so.6')
. Jeśli korzystasz z innego systemu operacyjnego, rzeczy mogą się trochę zmienić (lub całkiem sporo).źródło
Odpowiedź Chinmaya Kanchi jest doskonała, ale chciałem mieć przykład funkcji, która przekazuje i zwraca zmienne / tablice do kodu C ++. Pomyślałem, że umieściłbym to tutaj na wypadek, gdyby było przydatne dla innych.
Przekazywanie i zwracanie liczby całkowitej
Kod C ++ funkcji, która pobiera liczbę całkowitą i dodaje ją do zwracanej wartości,
Zapisany jako plik
test.cpp
, zanotuj wymagany zewnętrzny "C" (można go usunąć dla kodu C). Jest to kompilowane przy użyciu g ++, z argumentami podobnymi do odpowiedzi Chinmay Kanchi,Kod Pythona wykorzystuje
load_library
odnumpy.ctypeslib
założenia ścieżki do biblioteki współdzielonej w tym samym katalogu co skrypt Pythona,To wypisuje 6 zgodnie z oczekiwaniami.
Przekazywanie i drukowanie tablicy
Możesz również przekazać tablice w następujący sposób, aby kod C wydrukował element tablicy,
który jest kompilowany jak poprzednio, a importowany w ten sam sposób. Dodatkowy kod Pythona do użycia tej funkcji wyglądałby wtedy:
gdzie określamy tablicę, pierwszy argument do
print_array
, jako wskaźnik do tablicy Numpy wyrównanych, ciągłych 64-bitowych pływaków c_, a drugi argument jako liczbę całkowitą, która mówi kodowi C liczbę elementów w tablicy Numpy. To jest następnie drukowane przez kod C w następujący sposób,źródło
import numpy as np
. W przeciwnym razie nie jest w stanie znaleźćnp.float64
i innych rzeczy.Po pierwsze:
>>>
kod, który widzisz w przykładach w Pythonie, jest sposobem na wskazanie, że jest to kod w Pythonie. Służy do oddzielania kodu Pythona od danych wyjściowych. Lubię to:Tutaj widzimy, że wiersz zaczynający się od
>>>
jest kodem Pythona, a wynikiem jest 9. Dokładnie tak to wygląda, jeśli uruchomisz interpreter języka Python, dlatego właśnie tak się dzieje.Nigdy nie wprowadzasz
>>>
części do.py
pliku.To rozwiązuje problem z błędem składni.
Po drugie, ctypes to tylko jeden z kilku sposobów pakowania bibliotek Pythona. Inne sposoby to SWIG , który sprawdzi twoją bibliotekę Pythona i wygeneruje moduł rozszerzenia Python C, który ujawnia C API. Innym sposobem jest użycie Cythona .
Wszystkie mają zalety i wady.
SWIG ujawni twoje C API tylko dla Pythona. Oznacza to, że nie dostajesz żadnych obiektów ani niczego, musisz to zrobić w osobnym pliku Pythona. Powszechne jest jednak posiadanie modułu o nazwie powiedzmy „wowza” i modułu SWIG o nazwie „_wowza”, który jest opakowaniem wokół C API. To miły i łatwy sposób na robienie rzeczy.
Cython generuje plik C-Extension. Ma tę zaletę, że cały kod Pythona, który piszesz, jest tworzony w C, więc obiekty, które piszesz, są również w C, co może poprawić wydajność. Ale musisz się nauczyć, jak łączy się z C, więc nauczenie się, jak go używać, wymaga trochę dodatkowej pracy.
ctypes mają tę zaletę, że nie ma kodu C do skompilowania, więc jest bardzo przyjemny w użyciu do pakowania standardowych bibliotek napisanych przez kogoś innego i już istnieje w wersjach binarnych dla Windows i OS X.
źródło