Visual Studio 2013 編譯 64 位元 Python 的 C 擴充 (使用 PyObject 封裝)

來源:互聯網
上載者:User

標籤: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 封裝)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.