programing

ctype을 사용하여 python 문자열 개체를 char*로 변환

megabox 2023. 9. 16. 08:53
반응형

ctype을 사용하여 python 문자열 개체를 char*로 변환

C타입을 이용하여 파이썬(3.2)에서 C로 2개의 문자열을 보내려고 합니다.이것은 제 라즈베리 파이 프로젝트의 작은 부분입니다.C 함수가 문자열을 제대로 받았는지 테스트하기 위해 텍스트 파일에 문자열 중 하나를 배치합니다.

파이썬 코드

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코드

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

문제가

문자열의 첫 글자만 텍스트 파일에 나타납니다.

저는 파이썬 문자열 객체를 c타입으로 변환하기 위해 여러 가지 방법을 시도했습니다.

  • ctype.c_char_p
  • ctype.c_wchar_p
  • ctype.create_string_string

이러한 변환을 사용하면 "잘못된 유형" 또는 "문자 대신 바이트 또는 정수 주소가 예상됨"이라는 오류가 계속 발생합니다.

누가 어디가 잘못됐는지 말해줬으면 좋겠어요.미리 감사드립니다.

Eryksun 덕분에 해결:

파이썬 코드

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)

create_string_buffer() 대신 c_char_p()를 사용하시면 될 것 같습니다.

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

가변 문자열이 필요한 경우 create_string_buffer()를 사용하고 ctypes.cast()를 사용하여 c_char_p에 캐스트합니다.

SWIG 사용을 고려해보셨습니까?직접 시도해 본 적은 없지만 C 소스를 변경하지 않고 다음과 같이 표시됩니다.

/*mymodule.i*/

%module mymodule
extern void my_c_function(const char* str1, const char* str2);

이렇게 하면 Python 소스가 (컴플리케이션 생략)만큼 간단해집니다.

import mymodule

string1 = "my string 1"
string2 = "my string 2"
my_c_function(string1, string2)

참고 나는 확신할 수 없습니다..encode('utf-8')소스 파일이 이미 UTF-8인 경우 필요합니다.

언급URL : https://stackoverflow.com/questions/27127413/converting-python-string-object-to-c-char-using-ctypes

반응형