2011-03-23 5 views
0

ctypes를 사용하여 Python에서 add_two_U 함수를 호출하려고합니다. 함수 add_two_U는 같은 C++ 헤더 파일에 정의되어입력 매개 변수없이 ctypes를 사용하여 함수를 호출하는 방법은 무엇입니까?

구조의 ExternalInputs_add_two은 다음과 같이 헤더 파일에 정의되어
extern ExternalInputs_add_two add_two_U; 

:

typedef struct { 
    int32_T Input;      /* '<Root>/Input' */ 
    int32_T Input1;      /* '<Root>/Input1' */ 
} ExternalInputs_add_two; 

내가 아래에있는 내 파이썬 코드에서 호출 함수 add_two_initialize가 정의

extern void add_two_initialize(boolean_T firstTime); 

내 파이썬 코드 :

0,123,552 같은 헤더 파일

변수 U_Model을 통해 파이썬 코드에서 add_two_U 함수를 호출하려고합니다. 헤더 파일에서이 함수에는 입력 매개 변수가없고 헤더 파일의 구조를 사용하여 입력 데이터를 가져옵니다.

I가 다음 두 질문 :

  1. 가 어떻게이 add_two_U 함수에 데이터를 전달하기 위해 내 파이썬 코드의 구조 ExternalInputs_add_two 구조를 설정합니까?

  2. add_two_U을 사용하여 dll 함수를 호출하는 방법은 무엇입니까? U_Model을 파이썬 코드로 참조합니까?

    WindowsError: exception: access violation reading 0xFFFFFFFF 
    

내가 온라인 답변을 검색 한과를 찾을 수 없습니다 : 나는 다음과 같은 오류가

result = U_Model() 

: 나는 함수를 호출하는 파이썬 문을 사용하는 경우 헤더 파일에서 구조체를 초기화하고 매개 변수없이 함수를 호출하는 예제.

이 함수에는 입력 매개 변수가 있으므로 python 코드에서 add_two_initialize 함수를 initateModel에서 오류없이 호출 할 수 있습니다.

답변

1

add_two_U은 내 보낸 값입니다. in_dll을 사용해야합니다.

Accessing values exported from dlls을 참조하십시오.

+0

@ 스콧 나는이 질문이 당신의 대답 인 것으로 보이는 다른 질문을 본다.이 답 옆에있는 체크를 클릭하면 녹색으로 변합니다. 모든 세부 사항에 대해서는 FAQ를 읽으십시오. –

0

David,

내 첫 번째 질문에 답변 해 주셔서 감사합니다. 파이썬 코드를 다음과 같이 변경했습니다 :

#Comment out this line. add_two_U is not a function 
#U_Model = cdll.add_two_win32.add_two_U 

#Get the output pointer from add_two_U 
output = POINTER(ModelInput) 
results = output.in_dll(cdll.add_two_win32,"add_two_U") 

print "got results", results.contents() 

이 코드는 작동합니다. 나는 여전히 내 첫 번째 질문에 대한 해답을 이해할 수 없다 : 어떻게 ExternalInputs_add_two 구조체를 파이썬 코드의 헤더 파일에서 초기화하도록 설정해야 하는가?

ctypes 설명서를 검색했지만이를 수행하는 방법이나 예제를 찾을 수 없습니다. 아마 문서에 실린 것 같습니다.

+0

이 공간은 질문에 대한 답변으로 만 사용됩니다. 추가 정보를 추가하려면 원래 질문을 편집해야합니다. –

관련 문제