2013-07-22 1 views
2

타사 패키지에서 제공되는 C 모듈에 파이썬 확장을 써야합니다. 파이썬/C의 API에 설명 된대로C 전역 변수를 파이썬 확장자로 내보내기

int mcnumipar = 13; 

struct my_struct {char *name; 
        void *par; 
        enum instr_formal_types type; 
        char *val;}; 

struct my_struct mcinput[mcnumipar+1] = { 
    "E0", &mcipE0, instr_type_double, "4.94", 
    "dE", &mcipdE, instr_type_double, "0.24", 
    "dt", &mcipdt, instr_type_double, "6.4e-6", 
    "coh", &mcipcoh, instr_type_string, "Rb_liq_coh.sqw", 
    "inc", &mcipinc, instr_type_string, "Rb_liq_inc.sqw" 
}; 

내가 PyMethodDef 메커니즘을 사용하여 내 파이썬 확장에 C-방법을 수출에 성공 :이 모듈은 모듈 수준에서 다음과 같은 변수의 일부 방법의 선언을 포함하고 선적 서류 비치. 불행히도 글로벌 변수에 실패했습니다.

이러한 변수를 내 파이썬 확장자 (mcnumipar & mcinput)로 내보내는 방법이 있습니까?

덕분에 많은

+1

['PyObject_SetAttr'] (http://docs.python.org/2/c-api/object.html#PyObject_SetAttr)을 사용하면'object' 인스턴스의 속성을 설정할 수 있습니다 ('module 'objects), 그러나 정수는 파이썬 정수/long으로 포장해야합니다. 확장에 사용 된 변수가 아니라 파이썬 객체 만 변경되기 때문에 변수의 값을 설정할 때 문제가 발생합니다. Extension에서도 파이썬 int를 사용하는 것을 피할 수 있습니다 (값이 필요할 때 PyLong_AsLong 등을 사용하면됩니다). – Bakuriu

답변

1

물론

에릭. 가능하면 가장 쉬운 방법은 Py_BuildValue()을 사용하여 해당 변수에 대한 Python 개체를 만든 다음 PyObject_SetAttrString()을 사용하여 모듈 개체 (예 : Py_InitModule()으로 만든 개체)에 추가하는 것입니다.

전역 변수의 내용이 시간이 지남에 따라 변경 될 수 있고 파이썬 코드가 최신 값을 볼 수있게하려면 현재 값을 반환하는 추가 메서드가 더 잘 표시되는 것이 좋습니다.

세 번째 옵션으로 ctypes를 사용하여 해당 변수의 현재 값을 검사하거나 심지어 변경할 수 있습니다. 진정한 Python-C 모듈을 API의 일부로 구축하고 나머지를 ctypes로 노출하는 것은 약간 이상 할 것입니다. 그러나 결국 여러분의 필요에 부합 할 수 있습니다.

+0

도움을 주셔서 감사합니다. Py_BuildValue에서 볼 수있는 문제는'PyObject * pInt = Py_BuildValue ("i", 147);와 같은 상수 값을 선언 할 수 있다는 것입니다. 그러나 여기서 내가 필요로하는 것은 새로운 값을 생성하는 것이 아니라 그것을 가져 오는 것입니다 타사 C 파일에서. – Eurydice

+0

상수 값 대신 표현식을 Py_BuildValue (예 :'mcnumipar')에 전달할 수 있습니다. 링커는 C 모듈에서 호출 한 함수와 동일한 방법으로 이러한 심볼을 참조하는 방법을 알아야합니다. –

관련 문제