문제

나는 C에서 드라이버를위한 DLL을 개발했다. 나는 C ++에서 테스트 프로그램을 작성했으며 DLL은 잘 작동한다.

이제 Python을 사용 하여이 DLL과 공급하고 싶습니다. 사용자 정의 C 구조의 대부분을 성공적으로 숨겼지만 C 구조를 사용해야하는 지점이 있습니다. 나는 파이썬을 처음 접했기 때문에 문제가 발생할 수 있습니다.

내 접근 방식은 CType를 사용하여 파이썬의 몇 가지 구조를 재정의 한 다음 변수를 DLL로 전달하는 것입니다. 그러나이 클래스에는 다음과 같이 재귀 유형을 포함하는 사용자 정의 링크 목록이 있습니다.

class EthercatDatagram(Structure):
    _fields_ = [("header", EthercatDatagramHeader),
                ("packet_data_length", c_int),
                ("packet_data", c_char_p),
                ("work_count", c_ushort),
                ("next_command", EthercatDatagram)]

Ethercatdatagram 내부에서 Ethercatdatagram이 아직 정의되지 않았으므로 파서가 오류를 반환하기 때문에 실패합니다.

DLL이 올바르게 이해하도록이 링크 된 목록을 Python에서 어떻게 표현해야합니까?

도움이 되었습니까?

해결책

당신은 거의 확실히 Next_command를 포인터로 선언하고 싶습니다. 자체를 포함하는 구조를 갖는 것은 불가능합니다 (어떤 언어로든).

나는 이것이 당신이 원하는 것이라고 생각합니다.

class EthercatDatagram(Structure):
    pass
EthercatDatagram._fields_ = [
    ("header", EthercatDatagramHeader),
    ("packet_data_length", c_int),
    ("packet_data", c_char_p),
    ("work_count", c_ushort),
    ("next_command", POINTER(EthercatDatagram))]

다른 팁

이유 이유

EthercatDatagram._fields_.append(("next_command", EthercatDatagram))

작동하지 않습니다. 디스크립터 객체를 생성하는 기계는 ( PyCStructType_setattro 액세스를위한 기능) next_command 속성이 활성화됩니다 과제시 ~로 _fields_ 클래스의 속성. 새로운 필드를 목록에 추가하는 것은 완전히 눈에 띄지 않습니다.

이 함정을 피하려면 항상 튜플 (목록이 아닌)을 _fields_ 속성 : 이는 속성에 새 값을 할당하고 제자리에 수정하지 않아야한다는 것을 분명히합니다.

당신은 액세스해야합니다 _fields_ 정적으로 당신이 그것을 만든 후에.

class EthercatDatagram(Structure)
  _fields_ = [...]

EthercatDatagram._fields_.append(("next_command", EthercatDatagram))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top