반응형
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
반응형
'programing' 카테고리의 다른 글
여러 비동기 작업을 동시에 실행할 수 있습니까? (0) | 2023.09.16 |
---|---|
MySQL "IN" 쿼리는 하위 쿼리에서는 매우 느리지만 명시적 값에서는 빠릅니다. (0) | 2023.09.16 |
SharedPreferences.onSharedPreferenceChangeListener가 일관되게 호출되지 않음 (0) | 2023.09.16 |
MySQL 타임스탬프는 생성 시에만 사용 (0) | 2023.09.16 |
PowerShell PSScriptRoot가 null입니다. (0) | 2023.09.11 |