2017-09-14 1 views
0
  • ctypes를 사용하여 파이썬에서 래퍼 클래스를 생성해야합니다. 나는 지난주에 몇 주 동안 연구하고 코딩을 해왔으며 누구든지 에 기꺼이 질문 할 의향이 있습니다. 이 C 코드는 내가 작업중인 코드를 복제하는 최선의 방법이므로, 제시된 방식으로 구조화하지 않았다는 것을 명심하십시오!

    Python CTypes _argtypes에는 from_params 메소드가 없습니다.

    import ctypes 
    from ctypes import * 
    
    srclib = ctypes.CDLL('/path/DogHouse.so') 
    
    class dog(Structure): 
        _fields_ = [ 
         ("name", ctypes.c_char*10), 
         ("color", ctypes.c_char*10)]  
    
    pug = dog("doug", "white") 
    
    #- Not sure if I need to define arg and res types -# 
    srclib.log_dog.argtypes = [pug] 
    #srclib.log_dog.restype = 
    
    srclib.log_dog(pug) 
    
    :
  • 나는 파이썬과
  • 리눅스

Question: When I try to run the following python code, I get this error:
File "pydog.py", line 21, in
srclib.log_dog.argtypes = [pug]
TypeError: item 1 in argtypes has no from_param method

pydog.py에 파이썬 2.7.2, 및 GCC 4.4.2를 사용하는 ctypes 라이브러리 모두 비교적 새로운 오전

DogHouse.h :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* opaque handle */ 
typedef struct __dog_file dogfile; 

/* Input data structure */ 
typedef struct __dog_input{ 
    const char *name; 
    const char *color; 
    }dog_input; 

/*Logs the dog_input data into the dog_file struct */ 
dog_file *log_dog(const dog_input *data); 

DogHouse.c : 나는 "from_param"에 대한 구문을 찾는 시도했지만 특정하는 ctypes하면 내가 확실하지 않다 (I 필요한 구체적으로 무엇을 찾을 수 없습니다

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "DogHouse.h" 

struct __dog_file{ 
    const char *name; 
    const char *color; 
    }; 

dog_file *log_dog(const dog_input *data){ 

     dog_file *df;    
     df->name = data->name; 
     df->color = data->color; 

     return df; 
} 

int main(int argc, char **argv){ 

} 

또는 표준 파이썬 라이브러리.

이것은 내 첫 번째 질문이므로, 내가 무엇인가를 바꿀 필요가 있다면/좀 더 분명히 알려주세요! 모든 도움을 미리 감사드립니다.

+0

마크가 실제 오류를 지적하지만, 명확하게는,'from_param'는하는 ctypes 유형 함수 인수를 변환하는 ctypes에 의해 호출 클래스 방법이다. 함수 포인터에'argtypes'를 할당하면 각 타입의'from_param' 변환기를 참조해야합니다. 표준 타입은 포인터 타입에 대해'None','c_char_p' 나'c_wchar_p '에 대한 파이썬 문자열,'c_int'에 대한 정수 등의 기본적인 변환을하는이 메소드의 구현을 가지고 있습니다. – eryksun

답변

1

argtypes의 값은 유형이어야합니다. pug은 인스턴스입니다. 주어진 코드는 컴파일되지 않을 것이지만, 다음은 내가 생각 해낸 것입니다 :

pydog.py

import ctypes 

srclib = ctypes.CDLL('DogHouse') 

# An opaque class 
class dog_file(ctypes.Structure): 
    pass 

# c_char_p should be used for "const char *" 
class dog_input(ctypes.Structure): 
    _fields_ = [ 
     ("name", ctypes.c_char_p), 
     ("color", ctypes.c_char_p)]  

srclib.log_dog.argtypes = [ctypes.POINTER(dog_input)] # pointer type 
srclib.log_dog.restype = ctypes.POINTER(dog_file) # pointer type to opaque class 

# bytes strings used for const char* (Python 3 syntax) 
# create instance and pass it to function 
pug = dog_input(b'doug',b'white') 
print(srclib.log_dog(pug)) 

DogHouse.h

/* opaque handle */ 
typedef struct dog_file dog_file; 

/* Input data structure */ 
typedef struct dog_input 
{ 
    const char* name; 
    const char* color; 
} dog_input; 

/*Logs the dog_input data into the dog_file struct */ 
__declspec(dllexport) 
dog_file* log_dog(const dog_input* data); 

개집. c

#include <stdlib.h> 
#include "DogHouse.h" 

typedef struct dog_file 
{ 
    const char* name; 
    const char* color; 
} dog_file; 

dog_file* log_dog(const dog_input* data) 
{ 
    dog_file* df = malloc(sizeof(dog_file)); 
    df->name = data->name; 
    df->color = data->color; 
    return df; 
} 

함수 implementationion에서 원본이 지역 변수를 반환하고있었습니다. 이 버전은 메모리를 malloc하지만 메모리를 유실하거나 메모리 누수가있는 다른 함수를 내 보내야합니다.

출력 (불투명 포인터 인스턴스)

<__main__.LP_dog_file object at 0x00000000030040C8> 
+0

'from ctypes는 ctypes import 구조체에서 POINT '를 가져 오므로 네임 스페이스 오염이 적습니다. – eryksun