Próbuję wysłać 2 ciągi znaków z Pythona (3.2) do C za pomocą ctypes. To niewielka część mojego projektu na moim Raspberry Pi. Aby sprawdzić, czy funkcja C poprawnie odebrała łańcuchy, umieszczam jeden z nich w pliku tekstowym.Konwertowanie obiektu napisowego Pythona na c char * przy użyciu ctypów
kod Python
string1 = "my string 1"
string2 = "my string 2"
# create byte objects from the strings
b_string1 = string1.encode('utf-8')
b_string2 = string2.encode('utf-8')
# send strings to c function
my_c_function(ctypes.create_string_buffer(b_string1),
ctypes.create_string_buffer(b_string2))
kod C
void my_c_function(const char* str1, const char* str2)
{
// Test if string is correct
FILE *fp = fopen("//home//pi//Desktop//out.txt", "w");
if (fp != NULL)
{
fputs(str1, fp);
fclose(fp);
}
// Do something with strings..
}
Problem
tylko pojawi się pierwsza litera napisu w pliku tekstowym.
Próbowałem na wiele sposobów, aby przekonwertować obiekt łańcuchowy Python na ctypes.
- ctypes.c_char_p
- ctypes.c_wchar_p
- ctypes.create_string_buffer
Z tymi konwersjami ciśgle błąd "niewłaściwy typ" lub „bajtów lub adres całkowitą oczekiwane zamiast str instancji ".
Mam nadzieję, że ktoś może mi powiedzieć, gdzie jest źle. Z góry dzięki.
Zestaw 'my_c_function.argtypes = [ctypes.c_char_p, ctypes.c_char_p]'. Następnie, ponieważ parametry są "const", po prostu wywołaj je jako 'my_c_function (b_string1, b_string2)'. – eryksun
FYI, literalna ukośnik odwrotny musi zostać zmieniony jako '\\" ', ale nie jest wymagany dla ukośnika. To po prostu '" /home/pi/Desktop/out.txt "'. – eryksun
@eryksun Dziękujemy za odpowiedź. Działa to teraz, zupełnie zapomniałem, że wciąż mam ustawione atrybuty c_wchar_p. O odcinkach, zawsze je pomieszam. – LittleOne