Mam skrypt Pythona i program C (napisałem ich obu, więc mam źródło). Potrzebuję przekazać duże ilości danych ze skryptu Pythona, który wywołuje wiele razy program C. Teraz pozwalam użytkownikowi wybierać między przekazywaniem ich z plikiem ascii lub binarnym, ale oba są dość powolne i bezużyteczne (mam na myśli, pliki są przydatne, jeśli chcesz przechowywać dane, ale usuwam te pliki na końcu scenariusz). os.system nie działa, argumenty są za duże. (Program C również używa plików do zwrócenia danych do Pythona, ale jest to znacznie mniej danych)Przepuścić wiele fragmentów danych z Python do C program
Zastanawiam się, co mogę zrobić, aby ta wymiana była szybka. Zapisywanie plików na dysk RAM? Jeśli tak, jak mogę to zrobić?
Słyszałem, że możliwe jest wywoływanie funkcji z biblioteki dll przy użyciu ctypes, ale nie wiem jak skompilować mój program jako bibliotekę DLL (używam wxdevC++ przy wygrywaniu 7 64). Lub go zawiń, ale nadal nie wiesz, czy to działa i czy jest skuteczne.
Czy ktoś może mi powiedzieć, jak mogę to zrobić?
(dane są wierzchołki 3d mesh)
EDIT: może więcej informacje mogą pomóc. Używam skryptu Pythona w innym programie (blender (open source)) i jest on wywoływany wiele razy (zwykle ponad 500 razy), ponieważ jest wewnątrz cyklu. Skrypt wysyła informacje o wierzchołkach (indeks 1 int i 3 float coords) do programu, a program powinien zwrócić wiele wierzchołków (tylko indeks int, ponieważ mogę znaleźć odpowiednie wierzchołki z pythonem). Więc nie jest to interaktywne, bardziej przypomina funkcję (ale jest napisane w C). Skrypt + program C (które są dodatkami blendera), który piszę powinien być wieloplatformowy, ponieważ będzie redystrybuowany (ja dam źródło i skompilowane programy). Może ta notatka może pomóc: program jest rzeczywiście napisany w języku C, a z python mogę znać adres w pamięci struktury zawierającej dane wierzchołków. Jeśli tylko wiem, jak to zrobić, lepiej jest przekazać programowi C tylko adres, a stamtąd znaleźć wszystkie pozostałe wierzchołki (są przechowywane na liście). Ale o ile wiem, nie mogę uzyskać dostępu do przestrzeni pamięci innego programu, i nie wiem, czy wywołanie programu za pomocą potoków lub czegoś innego inicjuje nowy wątek lub jest uruchamiane wewnątrz skryptu (który faktycznie jest uruchamiany pod wątek Blender) Ps: here the source i tutaj (3) powinna być definicja struct
(3): blendera/miksera/źródło/makesdna/DNA_meshdata_types.h
Napisałem program w C, mogę zmienić jak chcę. Więc komunikowanie czegoś z potokami jest jak pisanie na stdin? –
Jeśli dobrze cię rozumiem, tak. Na wszelki wypadek opublikuję przykład. – senderle
Dobrze, podpowiadam twój kod. Niestety będę redystrybuować kod, więc wolę używać tylko standardowych bibliotek (widziałem, że ta chwila jest zewnętrzną biblioteką). Spróbuję z rurami. I zawracam ci głowę jeszcze bardziej: czy twoim zdaniem tworzenie biblioteki współdzielonej i wywoływanie jej za pomocą ctypów również by działało? Btw naprawdę interesująca rzecz! –