孟小子 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 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败