对于 32 位 Python 的 C 扩展,以前用过 mingW32 编译,

但是 mingW32 不支持 64 位 Python 的 C 扩展编译,详情可见 stackoverflow,这位前辈的大意如下,

以下介绍 Visual Studio 2013 编译 64 位 Python 的 C 扩展步骤:

1)准备 C 文件和包装文件,

  ExtDemo.c

  1. // Purpose: C code, for wrappered.
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. int fact(int n)
  8. {
  9. if(n < )
  10. return ;
  11. return n * fact(n - );
  12. }
  13.  
  14. char * reverse(char * s)
  15. {
  16. char t;
  17. char *p = s;
  18. char *q = (s + (strlen(s) - ));
  19.  
  20. while(p < q)
  21. {
  22. t = *p;
  23. *p++ = *q;
  24. *q-- = t;
  25. }
  26.  
  27. return s;
  28. }
  29.  
  30. // just for unit test, for the two function above
  31. int unit_test(void)
  32. {
  33. // test fact()
  34. printf("4! = %d\n", fact());
  35. printf("8! = %d\n", fact());
  36. printf("12! = %d\n", fact());
  37.  
  38. // test reverse
  39. char s[] = "abcdef";
  40. printf("reversing 'abcdef', we get '%s'\n", reverse(s));
  41. char s2[] = "madam";
  42. printf("reversing 'madam', we get '%s'\n", reverse(s2));
  43.  
  44. return ;
  45. }

  包装代码 ExtDemo_Wrapper.c

  1. // Purpose: According to the C code, write the Wrapper.
  2.  
  3. #include "Python.h"
  4.  
  5. // function declaration
  6.  
  7. int fact(int n);
  8. char * reverse(char * s);
  9. int unit_test(void);
  10.  
  11. static PyObject * ED_fact(PyObject * self, PyObject * args)
  12. {
  13. int num;
  14. if(!PyArg_ParseTuple(args, "i", &num))
  15. return NULL;
  16. return (PyObject *)Py_BuildValue("i", fact(num));
  17. }
  18.  
  19. static PyObject * ED_reverse(PyObject * self, PyObject * args)
  20. {
  21. char * orig_str;
  22. if (!PyArg_ParseTuple(args, "s", &orig_str))
  23. return NULL;
  24. return (PyObject *)Py_BuildValue("s", reverse(orig_str));
  25. }
  26.  
  27. static PyObject * ED_unit_test(PyObject * self, PyObject * args)
  28. {
  29. unit_test();
  30. return (PyObject *)Py_BuildValue("");
  31. }
  32.  
  33. //////////////////////////////////////////////////////////////////////////////
  34.  
  35. static PyMethodDef EDMethods[] = {
  36. {"fact", ED_fact, METH_VARARGS, "fact( m )"}, // NOTE, the last string is doc-string of this function
  37. {"reverse", ED_reverse, METH_VARARGS, "reverse( str )"},
  38. {"unit_test", ED_unit_test, METH_VARARGS, "unit_test()"},
  39. {NULL, NULL},
  40. };
  41.  
  42. //////////////////////////////////////////////////////////////////////////////
  43.  
  44. void initED()
  45. {
  46. Py_InitModule("ED", EDMethods);
  47. }

  setup.py

  1. #!/usr/bin/env python
  2.  
  3. from distutils.core import setup, Extension
  4.  
  5. MOD = 'ED'
  6. setup(name=MOD, ext_modules=[
  7. Extension(MOD, sources=['ExtDemo.c', "ExtDemo_Wrapper.c"])])

2) Visual Studio 2013 工具准备及编译

  开始菜单打开 Visual Studio Tools 文件夹,

  

  选择 64bit Native Tools,双击打开,

  

  设置编译环境,如下, 关于这两个参数的含义请参考 distutils.core 官方 help 文档

  1. set DISTUTILS_USE_SDK=1
  2. set MSSdk=1

  

  

  切换到工程目录,编译,

  

  编译完成后,在工程目录下生成 build 文件夹,

  

  在其中 \build\lib.win-amd64-2.7 下得到编译生成的 pyd 文件,本例为 ED.pyd

  

3) 验证

完。

Visual Studio 2013 编译 64 位 Python 的 C 扩展 (使用 PyObject 包装)的更多相关文章

  1. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4

    对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...

  2. 关于Visual Studio 2013 编译 multi-byte character set MFC程序出现 MSB8031 错误的解决办法

    转自:http://blog.csdn.net/xiaochunzao/article/details/16987703 Visual Studio 2013 编译旧的 multi-byte char ...

  3. visual studio 2005 win7 64位版下载

    http://www.121down.com/soft/softview-19659.html 软件标签: visual studio visual studio 2005是由微软推出的一款基于.ne ...

  4. Visual Studio 2013编译Tesseract 3.04

    文章目录 去年时候使用了VS2008编译了Tesseract 3.02版本,主要是参考了一份官方文档,但是对于目前的最新版本并没有给出说明. 本文主要参考了Paul Vorbach的How to bu ...

  5. Windows下Visual Studio 2013编译Lua 5.2.3

    1.创建一个Visual C++的Empty Project,如果需要支持Windows XP将Platform Toolset设置为Visual Studio 2013 - Windows XP ( ...

  6. Visual Studio 2013 编译CEF步骤

    If you'd like to build the Chromium Embedded Framework (a wrapper for Chromium, for creating browser ...

  7. 使用visual c++ 2005编译64位可执行文件

    最近需要将一个32位的程序移植到64位上,由于原来是使用vs2003写的,vs2003本身并不支持编译64位系统上,只能升级到vs2005以上版本.个人还是比较喜欢vs2005,对c++来说,vs20 ...

  8. Visual Studio 2013编译Mozilla NPAPI 示例注意事项

    1.Platform Toolset设置Visual Studio 2013 - Windows XP (v120_xp). 2.Character Set设置Use Multi-Byte Chara ...

  9. Visual Studio 2013编辑器+SourceTree代码管理工具及扩展工具

    Visual Studio 2013: 美国微软公司的编辑开发工具 扩展工具: Resharper:进行深度代码分析,函数深度查询(ctrl+鼠标左): Grunt:是基于Node.js的项目以自动化 ...

随机推荐

  1. angular $index获取ng-repeat的上一条数据

    <div ng-repeat="item in dataList" ng-click="func($index,$index-1)"></di ...

  2. [总结]JS操作DOM常用API详解

    文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认识. 基本概念 在讲解操作DOM的api之前, ...

  3. BZOJ4805: 欧拉函数求和(杜教筛)

    4805: 欧拉函数求和 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 614  Solved: 342[Submit][Status][Discus ...

  4. Javascript 对象 - 数学对象

    数学对象 JavaScript中提供了math对象,math对象包含一些常用的属相和方法.Math对象与Array对象.String对象.Data对象不同,没有构造函数,因此不能创建Math对象.可直 ...

  5. (网页)HTML5

    1.html5基本格式: <!DOCTYPE> --> 文档类型声明. <html lang="zh-cn"> --> 表示html文档开始 & ...

  6. Powershell测试端口状态

    function Test-Port { Param([string]$ComputerName,$port = 5985,$timeout = 1000) try { $tcpclient = Ne ...

  7. NSMutableArray 增删操作测试

    NSMutableArray *testArray = [NSMutableArray array]; [testArray addObject:"]; [testArray addObje ...

  8. gcc5.4报错对‘std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()’未定义的引用

    我在编译ligra是遇到了这个问题,网上搜了一遍,发现是了原因https://gcc.gnu.org/onlinedocs/libstdc%2B%2B/manual/using_dual_abi.ht ...

  9. SQLServer数据表用法

    数据表定义 数据表(或称表)是数据库最重要的组成部分之一,数据库中以表为组织单位存储数据,数据库只是一个框架,数据表才是其实质内容.数据库管理工具中可以显示数据库中的所有数据表,数据表是数据库中一个非 ...

  10. #000 Python 入门第一题通过扩展,学到了更多的知识

    #1写在前面的话 我觉得这样学习或许能够在学习的过程中事半功倍 第一道简单的python编写代码输出10行带标号的“Hello,world.”,具体效果参阅输入输出示例 1:Hello,world. ...