Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting python string object to c char* using ctypes

I am trying to send 2 strings from Python (3.2) to C using ctypes. This is a small part of my project on my Raspberry Pi. To test if the C function received the strings correctly, I place one of them in a text file.

Python code

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)) 

C code

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.. } 

The problem

Only the first letter of the string appears in the text file.

I've tried many ways to convert the Python string object with ctypes.

  • ctypes.c_char_p
  • ctypes.c_wchar_p
  • ctypes.create_string_buffer

With these conversions I keep getting the error "wrong type" or "bytes or integer address expected instead of str instance".

I hope someone can tell me where it goes wrong. Thanks in advance.

like image 444
LittleOne Avatar asked Nov 25 '14 12:11

LittleOne


2 Answers

Thanks to Eryksun the solution:

Python code

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.argtypes = [ctypes.c_char_p, ctypes.char_p] my_c_function(b_string1, b_string2) 
like image 65
LittleOne Avatar answered Sep 16 '22 12:09

LittleOne


I think you just need to use c_char_p() instead of create_string_buffer().

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.c_char_p(b_string1),               ctypes.c_char_p(b_string2)) 

If you need mutable strings then use create_string_buffer() and cast those to c_char_p using ctypes.cast().

like image 30
Aksel Avatar answered Sep 17 '22 12:09

Aksel