孟小子 2016-02-28 11:25 采纳率: 100%
浏览 1901
已采纳

distutils Extension TypeError

最近在学习在Python中扩展C,在 创建setup.py文件的过程中出现了问题

在终端运行“python setup.py build ”命令是出现错误,错误提示为:
[m@localhost CPython]$ python setup.py build
Traceback (most recent call last):
File "setup.py", line 4, in
extest_module = Extension(name = 'Extest', sourses = ['Extest.c'], include_dirs = ['/usr/local/include'])
TypeError: init() takes at least 3 arguments (3 given)

我的 setup.py文件内容:

 #!/usr/bin/env python
from distutils.core import setup, Extension
extest_module = Extension(name = 'Extest', sourses = ['Extest.c'], include_dirs = ['/usr/local/include'])
setup(name = 'Extest', ext_modules = [extest_module])

我的demo主文件内容

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//#include"Python.h"

static PyObject * Extest_fac(PyObject *self, PyObject *args);
static PyObject * Extest_doppel(PyObject *self, PyObject *args);
int fac(int n);
char *reverse(char *s);

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

int main()
{
    int n;
    char s[] = "abcdef"; 
    //scanf("%d,&n");
    //printf("%d! == %d\n",n,fac(n));
    printf("4! == %d\n",fac(4));
    printf("reversing 'abcdef', we get '%s'\n", reverse(s));
    return 0;
}



static PyObject * Extest_fac(PyObject *self, PyObject *args){
    int res;          //parse result
    int  num;        //arg for fac()
    PyObject* retval;// return value

    res = PyArg_ParseTuple(args, "i", &num);
    if(!res) return NULL; // TypeError
    res = fac(num);
    retval = (PyObject*)Py_BuildValue("i", res);
    return retval;
}

static PyObject * Extest_doppel(PyObject *self, PyObject *args){
    char *orig_str, dupe_str;
    PyObeject *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;
}

int fac(int n)
{
    if (n < 2) return 1;
    return n * fac(n-1);
}

char *reverse(char *s)
{
    register char t, 
            *p = s , /* s 的头指针*/
            *q = (s + (strlen(s) - 1) ); //s的尾指针
   while (p < q)
    {
       t = *p;
       *p++ = *q;
       *q-- = t;
    }
    return  s;
}

  • 写回答

1条回答 默认 最新

  • shiter 人工智能领域优质创作者 2016-02-29 02:48
    关注

    没发现什么大问题,难道是路径错了么?楼主再看看路径和文件都放对这么

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试