《扩展和嵌入python解释器》1.3 回到例子中

来源:互联网 发布:淘宝电子面单怎么充值 编辑:程序博客网 时间:2024/04/28 05:18
1.3 回到例子

回到我们的例子函数中,现在,你应该能够理解下面这些语句:

if (!PyArg_ParseTuple(args, "s", &command))        return NULL;


根据是否由PyArg_ParseTuple()函数设置了异常,如果在参数列表中检测到错误(异常被设置), 则函数返回NULL(函数返回对象指针的错误标识)。否则,参数的字符串值已经被拷贝到本地变量command中了。这是一个分配的指针,你不应修改指针指向的字符串 (就象在标准C中,变量command应该正确地声明为"const char *command ")。

下面的语句调用了UNIX函数system(),传递给函数我们从PyArg_ParseTuple() 得到的字符串

 

 sts = system(command);

我们的spam.system() 函数必须把sts的值作为Python对象返回。这可以通过Py_BuildValue()函数实现, 此函数有点象PyArg_ParseTuple()函数的反函数,这个函数带一个格式化字符串和任意个C值,并且返回一个Python对象。Py_BuildValue() 函数的详细信息后面给出。

 

return Py_BuildValue("i", sts);

在本例中,它返回一个整数对象(的确,即使整数也是Python堆上的对象); 如果你有一个C函数返回无用参数(即函数返回void),相应的Python函数必须返回None 。你应习惯这么做(由Py_RETURN_NONE宏实现):

 

    Py_INCREF(Py_None);    return Py_None;

Py_None是Python空对象的C名称。这是一个典型的Python对象而不只是一个NULL 指针,正如我们已经看到的,在大多数情况下,Py_None表示错误。

原创粉丝点击