15.17 传递文件�给C扩展¶

问题¶

你需��C库函数传递文件�,但是需�确�文件�根�系统期望的文件�编�方�编�过。

解决方案¶

写一个接�一个文件�为�数的扩展函数,如下这样:

static PyObject *py_get_filename(PyObject *self, PyObject *args) {
  PyObject *bytes;
  char *filename;
  Py_ssize_t len;
  if (!PyArg_ParseTuple(args,"O&", PyUnicode_FSConverter, &bytes)) {
    return NULL;
  }
  PyBytes_AsStringAndSize(bytes, &filename, &len);
  /* Use filename */
  ...

  /* Cleanup and return */
  Py_DECREF(bytes)
  Py_RETURN_NONE;
}

如果你已�有了一个 PyObject * ,希望将其转��一个文件�,�以�下�这样�:

PyObject *obj;    /* Object with the filename */
PyObject *bytes;
char *filename;
Py_ssize_t len;

bytes = PyUnicode_EncodeFSDefault(obj);
PyBytes_AsStringAndSize(bytes, &filename, &len);
/* Use filename */
...

/* Cleanup */
Py_DECREF(bytes);

If you need to return a filename back to Python, use the following code:

/* Turn a filename into a Python object */

char *filename;       /* Already set */
int   filename_len;   /* Already set */

PyObject *obj = PyUnicode_DecodeFSDefaultAndSize(filename, filename_len);

讨论¶

以�移�方��处�文件�是一个很棘手的问题,最�交由Python�处�。 如果你在扩展代�中使用本节的技术,文件�的处�方�和和Python中是一致的。 包括编�/界�字节,处��字符,代�转�和其他��情况。