문제
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
필요한 진술은 간단한 경우 에도이 간단한 접근 방식이 실제로 충분할 수 있습니다.