我如何使我的Python扩展需要其他论点

How do I make my Python extension take additional arguments?

本文关键字:其他 扩展 何使 我的 Python      更新时间:2023-10-16

考虑我从Python文档页面上找到的以下示例代码。现在需要一个论点。我想让它接受一个命名的参数,例如"模式= 2"。这样我就可以调用myext.do_something('/home/home/crypto/sosings.jpg',mode = 2)。使用模式传递的参数应该是一个整数,如果它得到其他内容,我希望它在Python中引起错误。我该怎么做?我认为我应该编辑module_functions [],但我不知道该放在那里。

#include <Python.h>
static PyObject * 
do_something(PyObject *self, PyObject *args)
{
   char *filename;
   if (!PyArg_ParseTuple(args, "s", &filename))
      return NULL;
   char *result = do_somethingelse(filename);
   return Py_BuildValue("s", result);
}
static PyMethodDef
module_functions[] = {
    { "do_something", do_something, METH_VARARGS, "do something" },
    { NULL }
};

PyMODINIT_FUNC
initmyext(void)
{
    Py_InitModule("myext", module_functions);
}

这是一个最小示例:

#include <Python.h>
static PyObject * 
do_something(PyObject *self, PyObject *args, PyObject *kwargs)
{
   char *filename;
   int mode = 2;
   static char *keywords[] = {"filename", "mode", NULL};
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", keywords, &filename, &mode))
      return NULL;
   char *result = do_somethingelse(filename);
   return Py_BuildValue("s", result);
}
static PyMethodDef
module_functions[] = {
    { "do_something", (PyCFunction)do_something, METH_VARARGS | METH_KEYWORDS, "do something" },
    { NULL }
};

PyMODINIT_FUNC
initmyext(void)
{
    Py_InitModule("myext", module_functions);
}
相关文章: