標籤:vararg 完成後 question https purpose image img var --
對於 32 位 Python 的 C 擴充,以前用過 mingW32 編譯,
但是 mingW32 不支援 64 位元 Python 的 C 擴充編譯,詳情可見 stackoverflow,這位前輩的大意如下,
以下介紹 Visual Studio 2013 編譯 64 位元 Python 的 C 擴充步驟:
1)準備 C 檔案和封裝檔案,
ExtDemo.c
// Purpose: C code, for wrappered.#include <stdio.h>#include <stdlib.h>#include <string.h>int fact(int n){ if(n < 2) return 1; return n * fact(n - 1);}char * reverse(char * s){ char t; char *p = s; char *q = (s + (strlen(s) - 1)); while(p < q) { t = *p; *p++ = *q; *q-- = t; } return s;}// just for unit test, for the two function aboveint unit_test(void){ // test fact() printf("4! = %d\n", fact(4)); printf("8! = %d\n", fact(8)); printf("12! = %d\n", fact(12)); // test reverse char s[10] = "abcdef"; printf("reversing ‘abcdef‘, we get ‘%s‘\n", reverse(s)); char s2[10] = "madam"; printf("reversing ‘madam‘, we get ‘%s‘\n", reverse(s2)); return 0;}
封裝代碼 ExtDemo_Wrapper.c
// Purpose: According to the C code, write the Wrapper.#include "Python.h"// function declarationint fact(int n);char * reverse(char * s);int unit_test(void);static PyObject * ED_fact(PyObject * self, PyObject * args){ int num; if(!PyArg_ParseTuple(args, "i", &num)) return NULL; return (PyObject *)Py_BuildValue("i", fact(num));}static PyObject * ED_reverse(PyObject * self, PyObject * args){ char * orig_str; if (!PyArg_ParseTuple(args, "s", &orig_str)) return NULL; return (PyObject *)Py_BuildValue("s", reverse(orig_str));}static PyObject * ED_unit_test(PyObject * self, PyObject * args){ unit_test(); return (PyObject *)Py_BuildValue("");}//////////////////////////////////////////////////////////////////////////////static PyMethodDef EDMethods[] = { {"fact", ED_fact, METH_VARARGS}, {"reverse", ED_reverse, METH_VARARGS}, {"unit_test", ED_unit_test, METH_VARARGS}, {NULL, NULL},};//////////////////////////////////////////////////////////////////////////////void initED(){ Py_InitModule("ED", EDMethods);}
setup.py
#!/usr/bin/env pythonfrom distutils.core import setup, ExtensionMOD = ‘ED‘setup(name=MOD, ext_modules=[ Extension(MOD, sources=[‘ExtDemo.c‘, "ExtDemo_Wrapper.c"])])
2) Visual Studio 2013 工具準備及編譯
開始菜單開啟 Visual Studio Tools 檔案夾,
選擇 64bit Native Tools,雙擊開啟,
設定編譯環境,如下, 關於這兩個參數的含義請參考 distutils.core 官方 help 文檔,
set DISTUTILS_USE_SDK=1set MSSdk=1
切換到工程目錄,編譯,
編譯完成後,在工程目錄下產生 build 檔案夾,
在其中 \build\lib.win-amd64-2.7 下得到編譯產生的 pyd 檔案,本例為 ED.pyd
3) 驗證
完。
Visual Studio 2013 編譯 64 位元 Python 的 C 擴充 (使用 PyObject 封裝)