python扩展错误

来源:互联网 发布:淘宝店铺头像制作logo 编辑:程序博客网 时间:2024/06/06 17:10

 Windows下python扩展编程出现的错误解决

错误1:当在cmd命令下输入目录下的setup.py build,出现error: Unable to find vcvarsall.bat,但是本机上有这个文件,说是自动寻找的是vs9.0版本的,而我的是vs2010

错误2:针对错误1,在网上搜索的答案大都是将setup.py build 改成为setup.py build –compiler=mingw32或者setup.py build –c mingw32

,但是都出现gcc找不到错误,因为没有安装这个,太麻烦了,而且自己电脑上有vs

 

处理方法如下:

1.打开Visual Studio 2010命令行编译模式,你可以依次从开始菜单 – Microsoft Visual Studio 2010 – Visual Studio Tools – Visual Studio x64 Win64 命令提示(2010),如下图所示:

2.使用下面的命令设置环境:

set DISTUTILS_USE_SDK=1

set MSSdk=1

3.切换到所要编译的扩展setup.py所在路径运行下面的命令进行编译:

python setup.py install

(用install表示建立并且将代码包复制到python的安装环境,而用build只是在build\lib*中建立代码包,要直接使用得自己拷贝进python\Lib\site-packages中)一会儿后如果相关依赖没有错误,并且源代码正确的话应该可以成功编译!编译完成后你可以从build\lib*找到代码包,并且也已经安装进Python环境中去了。

如果编译出现问题,比如链接失败,你可以检查下环境设置是否有问题,比如系统Path变量是否包含C:\Python27\libs假设Python装在C盘。

 

 

setup.py如下:

#!/usr/bin/env python
 
from distutils.core import setup, Extension
 
MOD = 'Extest'
setup(name=MOD, ext_modules=[Extension(MOD, sources=['Extest.c'])])

 

 

Extest.c如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int fac(int n)
{
 if (n < 2) return(1);
 return (n)*fac(n-1);
}

char *reverse(char *s)
{
 register char t,
 *p = s,
 *q = (s + (strlen(s) - 1));
 
 while (s && (p < q))
 {
 t = *p;
 *p++ = *q;
 *q-- = t;
 }
 return s;
}

int test()
{
 char s[BUFSIZ];
 printf("4! == %d\n", fac(4));
 printf("8! == %d\n", fac(8));
 printf("12! == %d\n", fac(12));
 strcpy(s, "abcdef");
 printf("reversing 'abcdef', we get '%s'\n", reverse(s));
 strcpy(s, "madam");
 printf("reversing 'madam', we get '%s'\n", reverse(s));
 return 0;
}

 

#include "Python.h"
 
static PyObject *
Extest_fac(PyObject *self, PyObject *args)
{
 int num;
 if (!PyArg_ParseTuple(args, "i", &num))
  return NULL;
 return (PyObject*)Py_BuildValue("i", fac(num));
}
 
static PyObject *
Extest_doppel(PyObject *self, PyObject *args)
{
 char *orig_str;
 char *dupe_str;
 PyObject* retval;

 if (!PyArg_ParseTuple(args, "s", &orig_str))
 return NULL;
 retval = (PyObject*)Py_BuildValue("ss", orig_str, dupe_str=reverse(strdup(orig_str)));
 free(dupe_str);
 return retval;
}
 
static PyObject *
Extest_test(PyObject *self, PyObject *args)
{
 test();
 return (PyObject*)Py_BuildValue("");
}

static PyMethodDef
ExtestMethods[] =
{
 { "fac", Extest_fac, METH_VARARGS },
 { "doppel", Extest_doppel, METH_VARARGS },
 { "test", Extest_test, METH_VARARGS },
 { NULL, NULL },
};
 
void initExtest()
{
 Py_InitModule("Extest", ExtestMethods);
}

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 尿结石不能排尿怎么办 肾癌小便有血怎么办 膀胱癌膀胱全切怎么办 怀孕了有阑尾炎怎么办 食物堵塞在食管怎么办 食物卡在食管怎么办 小孩食道卡异物怎么办 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办 透析病人磷高怎么办 尿毒症透析磷高怎么办 怀孕了有膀胱炎怎么办 宝宝拉肚子尿少怎么办 猫尿血怎么办吃什么药 肝癌小便不出来怎么办 怀孕三个月结石血尿怎么办? 肾小球滤过率65怎么办 肾穿后有血肿6cm怎么办 肾穿刺后血肿怎么办 手术后有血肿怎么办 尿蛋白胆红素高怎么办 哺乳期尿蛋白高怎么办 产后老放屁便秘怎么办 肝癌移植后复发怎么办 产后屁多便秘怎么办 肝癌切除后复发怎么办 宝宝便秘拉不出大便怎么办 宝宝便秘屁多怎么办 尿液浑浊气味重怎么办 经常便秘肚子胀怎么办 顺产满月后腰疼怎么办 化验尿蛋白质高怎么办 小孩子反复蛋白尿怎么办呢?