您的位置:首页 > 编程语言 > Python开发

Python的C扩展问题

2015-10-31 20:02 441 查看
最近看Python核心编程第二版,关于python的C扩展。书随带的源代码(应该是不会有什么代码错误的,朋友在linux下跑完全无障碍,还是linux大法好啊)有以下两个文件,第一个是python包装过的C语言文件,第二个是编译的setup.py文件。

系统环境是win7ultimate。

python的话python2.7和python3.5共存。

我用python2.7 install setup.py文件,报错显示unable to find vcvarsall.bat文件。用python3则报了一串复杂的错误(我直观感觉是setup.py文件语法是针对python2的),但没有报错说找不到vcvarsall.bat,这应该能说明python3是能找到C语言编译器的(当然也有可能语法错误导致解释器提前中止)。使用python3的报错如下图:



之前电脑装过VC6.0,VS2013,之后都卸载了,不过编译环境之类的仍然存在电脑里(VC++那些库当然都有,不然怎么玩游戏)。我搜索了关于那个bat文件找不到的解决办法,主要有以下几种:

①用mingw作为替代用的编译器,则报错如下:



用python3尝试,如下:



②将bat文件所在路径加入PATH环境变量中。然而我的PATH中本来就有。不可行。

③安装VisualStudio.我重新安装了VS2015,问题依旧。

关于安装VS解决这个问题,网上有帖子说最好安装VS2008,也有说如果安装VS2010或更高版本的话则免去配置麻烦。我直接上的最新的VS2015。按理说Python2最新的python2.7.10应该不会存在老旧的问题吧。

这是C语言代码,文件名Extest2.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);
}


这是python代码,文件名setup.py。

#!/usr/bin/env python

from distutils.core import setup, Extension

MOD = 'Extest'
setup(name=MOD, ext_modules=[
Extension(MOD, sources=['Extest2.c'])])

自己暂时还没有在其他系统上跑过这些代码,之后应该会去ubuntu和win10上跑一遍。以上问题今天非常困扰我,暂时Mark一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息