对于 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 < )
return ;
return n * fact(n - );
} char * reverse(char * s)
{
char t;
char *p = s;
char *q = (s + (strlen(s) - )); while(p < q)
{
t = *p;
*p++ = *q;
*q-- = t;
} return s;
} // just for unit test, for the two function above
int unit_test(void)
{
// test fact()
printf("4! = %d\n", fact());
printf("8! = %d\n", fact());
printf("12! = %d\n", fact()); // test reverse
char s[] = "abcdef";
printf("reversing 'abcdef', we get '%s'\n", reverse(s));
char s2[] = "madam";
printf("reversing 'madam', we get '%s'\n", reverse(s2)); return ;
}

  包装代码 ExtDemo_Wrapper.c

// Purpose: According to the C code, write the Wrapper.

#include "Python.h"

// function declaration

int 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, "fact( m )"}, // NOTE, the last string is doc-string of this function
{"reverse", ED_reverse, METH_VARARGS, "reverse( str )"},
{"unit_test", ED_unit_test, METH_VARARGS, "unit_test()"},
{NULL, NULL},
}; ////////////////////////////////////////////////////////////////////////////// void initED()
{
Py_InitModule("ED", EDMethods);
}

  setup.py

#!/usr/bin/env python

from distutils.core import setup, Extension

MOD = '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=1
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. 2019-01-13 [日常]mov文件转换为gif

    因为需要将之前mac下用QuickTime录屏生成的文件(mov格式)转换成gif文件, 便于传到某些博客平台, 于是找到了这个转换工具, 已将原代码的命名中文化并简化. Ruby和视频转换都是新手, ...

  2. Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析

    一.深入JVM锁机制:synchronized synrhronized关键字简洁.清晰.语义明确,因此即使有了Lock接口,使用的还是非常广泛.其应用层的语义是可以把任何一个非null对象作为&qu ...

  3. Testlink1.9.17使用方法(第十二章 总结)

    第十二章 总结 QQ交流群:585499566 TestLink用于进行测试过程中的管理,通过使用TestLink提供的功能,我们可以将测试过程从:测试需求.测试设计.到测试执行.完整的管理起来,同时 ...

  4. git 入门教程之备忘录[译]

    备忘录[译] 创建 | Create 克隆一个已存在的仓库 | Clone an existing repository git clone git@github.com:snowdreams1006 ...

  5. (后端)mybatis 模糊查询 mapper.xml的写法(转)

    原文地址:https://blog.csdn.net/sc6231565/article/details/46412765 1. sql中字符串拼接 SELECT * FROM tableName W ...

  6. CSS之表格边框合并、兄弟标签外边距合并、父子标签的外边距合并

    本文内容: 表格边框合并 兄弟标签外边距合并 父子标签的外边距合并 首发日期:2018-05-01 表格边框合并: 发生情况: 当设置了cellpadding="0" cellsp ...

  7. 关于getdate()的不同的日期格式

    在使用Sql Server查询数据库时,我们经常会需要查询日期格式的数据,对于日期在sql语言中的格式有一定的要求,通过修改convert中的最后一位参数,可以返回不通格式的时间,具体实现如下: Se ...

  8. 爬虫入门实例:利用requests库爬取笔趣小说网

    w3cschool上的来练练手,爬取笔趣看小说http://www.biqukan.com/, 爬取<凡人修仙传仙界篇>的所有章节 1.利用requests访问目标网址,使用了get方法 ...

  9. python第一百零八天---Django 3 session 操作

    上节内容回顾: 1.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? Form表单提交: 提交 -> url > 函数或类中的方法 - .... Ht ...

  10. Javascript 高级程序设计--总结【三】

    ********************  Chapter 8 BOM ******************** BOM由浏览器提供商扩展 window: 既是js访问浏览器窗口的接口,又是Globa ...