Visual Studio 2013 编译 64 位 Python 的 C 扩展 (使用 PyObject 包装)
对于 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 包装)的更多相关文章
- 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的版本,并且支持 ...
- 关于Visual Studio 2013 编译 multi-byte character set MFC程序出现 MSB8031 错误的解决办法
转自:http://blog.csdn.net/xiaochunzao/article/details/16987703 Visual Studio 2013 编译旧的 multi-byte char ...
- visual studio 2005 win7 64位版下载
http://www.121down.com/soft/softview-19659.html 软件标签: visual studio visual studio 2005是由微软推出的一款基于.ne ...
- Visual Studio 2013编译Tesseract 3.04
文章目录 去年时候使用了VS2008编译了Tesseract 3.02版本,主要是参考了一份官方文档,但是对于目前的最新版本并没有给出说明. 本文主要参考了Paul Vorbach的How to bu ...
- Windows下Visual Studio 2013编译Lua 5.2.3
1.创建一个Visual C++的Empty Project,如果需要支持Windows XP将Platform Toolset设置为Visual Studio 2013 - Windows XP ( ...
- Visual Studio 2013 编译CEF步骤
If you'd like to build the Chromium Embedded Framework (a wrapper for Chromium, for creating browser ...
- 使用visual c++ 2005编译64位可执行文件
最近需要将一个32位的程序移植到64位上,由于原来是使用vs2003写的,vs2003本身并不支持编译64位系统上,只能升级到vs2005以上版本.个人还是比较喜欢vs2005,对c++来说,vs20 ...
- Visual Studio 2013编译Mozilla NPAPI 示例注意事项
1.Platform Toolset设置Visual Studio 2013 - Windows XP (v120_xp). 2.Character Set设置Use Multi-Byte Chara ...
- Visual Studio 2013编辑器+SourceTree代码管理工具及扩展工具
Visual Studio 2013: 美国微软公司的编辑开发工具 扩展工具: Resharper:进行深度代码分析,函数深度查询(ctrl+鼠标左): Grunt:是基于Node.js的项目以自动化 ...
随机推荐
- margin:0 auto是什么意思
一.margin设置对象外边距 二.margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right 因为0 auto
- Flex 项目属性:flex 布局示例
flex属性: flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto.后两个属性可选. 该属性有两个快捷值:auto (1 1 auto ...
- HDU 1847 Good Luck in CET-4 Everybody!(找规律版巴什博奕)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- [Intellij] 在IntelliJ IDEA 中创建运行web项目
安装工具 1.JDK7+ 2.IntelliJ Idea 工具(下载安装后,网上找注册码破解即可) 3.tomcat7+ 解压缩版 明确两个概念: 1.Project:类似于eclipse的works ...
- 2.Odoo产品分析 (一) – 一切为零
查看Odoo产品分析系列--目录 1. 默认数据库 声明在先 本系列文档(Odoo产品分析)整理来自本人对该ERP的理解,并结合文档Working-with-Odoo-10-Second-Editi ...
- Android图片的Base64编码与解码
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较 ...
- Android调用系统图库返回路径
调用系统图库: Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ...
- Flutter 布局(一)- Container详解
本文主要介绍Flutter中非常常见的Container,列举了一些实际例子介绍如何使用. 1. 简介 A convenience widget that combines common painti ...
- DBA思考系列——学会拒绝不合理的需求
DBA思考系列--学会拒绝不合理的需求 一直以来,个性都比较随意,一般很少拒绝开发人员的一些需求(有点老好人的感觉). 这点一直被老大诟病,也一直在反省!最近又有一件事情,让我觉得:应该学会拒绝不 ...
- PL/SQL重新编译包无反应案例2
在这篇"PL/SQL重新编译包无反应"里面介绍了编译包无反应的情况,今天又遇到一起案例, 在测试环境中,一个包的STATUS为INVALID,重新编译时,一直处于编译状态,检查发现 ...