복붙노트

[PYTHON] Cython 모듈에서 #defined C 값을 Python에 어떻게 노출시킬 수 있습니까?

PYTHON

Cython 모듈에서 #defined C 값을 Python에 어떻게 노출시킬 수 있습니까?

정수 상수 (ACTIVE_TAG 등)를 여기에 정의하고 싶습니다.

//island management, m_activationState1
#define ACTIVE_TAG 1
#define ISLAND_SLEEPING 2
#define WANTS_DEACTIVATION 3
#define DISABLE_DEACTIVATION 4
#define DISABLE_SIMULATION 5

Cython에서 정의한 모듈의 일반 속성으로 사용할 수 있으므로 Python 응용 프로그램 코드에서 액세스 할 수 있습니다. (파이썬 응용 프로그램 코드에서 파이썬 응용 프로그램 코드를 액세스 할 수 있습니다.

Cdef를 정수 또는 enum으로 정의하는 방법을 살펴 보았습니다.하지만이 두 방법 모두 실제로 값을 Cython 모듈의 특성에 바인딩하지 않습니다. 다른 옵션은 무엇입니까?

해결법

  1. ==============================

    1.다음과 같은 한 가지 방법이 있습니다. 겉으로보기에는 지루하지만, 주어진 .h 파일에 대해 입력으로 자동 실행될 수 있습니다.

    다음과 같은 한 가지 방법이 있습니다. 겉으로보기에는 지루하지만, 주어진 .h 파일에 대해 입력으로 자동 실행될 수 있습니다.

    1 단계. 원하는 모든 상수를 파일에 넣으십시오. 예를 들어, #defines가 있지만 앞에 밑줄이있는 bulletdefs.h라고 말하십시오.

    #define _ACTIVE_TAG 1
    #define _ISLAND_SLEEPING 2
    #define _WANTS_DEACTIVATION 3
    #define _DISABLE_DEACTIVATION 4
    #define _DISABLE_SIMULATION 5
    

    2 단계. 모듈의 pyx 파일에 섹션을 삽입합니다 (예 : bullet.pyx :

    cdef extern from "bulletdefs.h":
        cdef int _ACTIVE_TAG
        cdef int _ISLAND_SLEEPING
        cdef int _WANTS_DEACTIVATION
        cdef int _DISABLE_DEACTIVATION
        cdef int _DISABLE_SIMULATION
    
    ACTIVE_TAG = _ACTIVE_TAG
    ISLAND_SLEEPING = _ISLAND_SLEEPING
    WANTS_DEACTIVATION = _WANTS_DEACTIVATION
    DISABLE_DEACTIVATION = _DISABLE_DEACTIVATION
    DISABLE_SIMULATION = _DISABLE_SIMULATION
    

    그런 다음 모듈을 컴파일 할 때 원하는 효과를 얻으십시오.

    Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
    [GCC 4.5.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import bullet
    >>> bullet.ACTIVE_TAG
    1
    >>> bullet.DISABLE_SIMULATION
    5
    >>>
    
  2. from https://stackoverflow.com/questions/5697479/how-can-a-defined-c-value-be-exposed-to-python-in-a-cython-module by cc-by-sa and MIT license