我想用一个修改其参数的函数编写一个c扩展名。这可能吗?
helloworld.c
#include <Python.h>
// adapted from http://www.tutorialspoint.com/python/python_further_extensions.htm
/***************\
* Argument Test *
\***************/
// Documentation string
static char arg_test_docs[] =
"arg_test(integer i, double d, string s): i = i*i; d = i*d;\n";
// C Function
static PyObject * arg_test(PyObject *self, PyObject *args){
int i;
double d;
char *s;
if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)){
return NULL;
}
i = i * i;
d = d * d;
Py_RETURN_NONE;
}
// Method Mapping Table
static PyMethodDef arg_test_funcs[] = {
{"func", (PyCFunction)arg_test, METH_NOARGS , NULL },
{"func", (PyCFunction)arg_test, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
void inithelloworld(void)
{
Py_InitModule3("helloworld", arg_test_funcs,
"Extension module example3!");
}
setup.py
from distutils.core import setup, Extension
setup(name='helloworld', version='1.0', \
ext_modules=[Extension('helloworld', ['helloworld.c'])])
安装:
python setup.py install
测试:
import helloworld
i = 2; d = 4.0; s='asdf'
print("before: %s, %s, %s" % (i,d,s))
helloworld.func(i,d,s)
print("after: %s, %s, %s" % (i,d,s))
测试结果:
before: 2, 4.0, asdf
after: 2, 4.0, asdf
不会更改整数和双精度值。 结果应该是“之后:4,16.0,asdf”
感谢您的帮助。
答案 0 :(得分:2)
我想用一个修改其参数的函数编写一个c扩展名。这可能吗?
仅在普通功能可行的范围内。你可以改变传递给你的对象,如果它们是可变的,但你不能重新分配用于传递这些对象的任何变量。 C API不会让你解决这个问题。
您要编写的功能无效。