문제

C Extension 모듈이있어 일부 Python 유틸리티 기능을 추가하고 싶습니다. 권장하는 방법이 있습니까?

예를 들어:

import my_module

my_module.super_fast_written_in_C()
my_module.written_in_Python__easy_to_maintain()

나는 주로 Python 2.X에 관심이 있습니다.

도움이 되었습니까?

해결책

이 작업을 수행하는 일반적인 방법은 : MyMod.py에는 Python으로 작성된 유틸리티 함수가 포함되어 있으며 C로 작성된 _Mymod 모듈에서 제품을 가져오고 _Mymod.so 또는 _mymod.pyd에서 가져옵니다. 예를 들어, 파이썬 분포에서 .../lib/csv.py를보십시오.

다른 팁

기본 확장을 밑줄로 접두사하십시오. 그런 다음 Python에서는 해당 기본 확장을 가져오고 그 위에 다른 비 네이티브 루틴을 추가하는 래퍼 모듈을 만듭니다.

기존 답변은 가장 자주 사용되는 방법을 설명합니다. 컴파일 된 C 확장을 사용할 수없는 플랫폼 (Jython 및 Ironpython 포함)에서 순수한 파이썬 (또는 다른 언어) 구현을 허용하는 잠재적 이점이 있습니다.

그러나 몇몇 경우에, 모듈을 C 층과 파이썬 층으로 분할하는 것이 좋습니다. gmpy (이 시간에 7113 FF 행) gmpy의 유형, 사용 :

copy_reg_module = PyImport_ImportModule("copy_reg");
if (copy_reg_module) {
    char* enable_pickle =
        "def mpz_reducer(an_mpz): return (gmpy.mpz, (an_mpz.binary(), 256))\n"
        "def mpq_reducer(an_mpq): return (gmpy.mpq, (an_mpq.binary(), 256))\n"
        "def mpf_reducer(an_mpf): return (gmpy.mpf, (an_mpf.binary(), 0, 256))\n"
        "copy_reg.pickle(type(gmpy.mpz(0)), mpz_reducer)\n"
        "copy_reg.pickle(type(gmpy.mpq(0)), mpq_reducer)\n"
        "copy_reg.pickle(type(gmpy.mpf(0)), mpf_reducer)\n"
    ;
    PyObject* namespace = PyDict_New();
    PyObject* result = NULL;
    if (options.debug)
        fprintf(stderr, "gmpy_module imported copy_reg OK\n");
    PyDict_SetItemString(namespace, "copy_reg", copy_reg_module);
    PyDict_SetItemString(namespace, "gmpy", gmpy_module);
    PyDict_SetItemString(namespace, "type", (PyObject*)&PyType_Type);
    result = PyRun_String(enable_pickle, Py_file_input,
                          namespace, namespace);

몇 가지 추가 기능이 모듈에서 "고집"을 원한다면 (이 예제에서는 필요하지 않음) 물론 모듈 객체를 Py_InitModule3 (또는 다른 방법) 및 그것 PyModule_GetDict 일시적 사전보다는 네임 스페이스로 PyRun_String. 물론 PyRun_String 그만큼 def 그리고 class 필요한 진술은 간단한 경우 에도이 간단한 접근 방식이 실제로 충분할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top