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
这是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一下。
系统环境是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一下。
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法