El nombre de archivo debe codificarse de acuerdo con la codificación de nombre de archivo esperada del sistema antes de pasar los nombres de archivo a las funciones de la biblioteca C.
Código #1: Para escribir una función de extensión que recibe un nombre de archivo
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; }
Si ya existe uno PyObject *
que debe convertirse como un nombre de archivo, use el código que se proporciona a continuación:
Código #2:
/* Object with the filename */ PyObject* obj; PyObject* bytes; char* filename; Py_ssize_t len; bytes = PyUnicode_EncodeFSDefault(obj); PyBytes_AsStringAndSize(bytes, &filename, &len); /* Use filename */ ... /* Cleanup */ Py_DECREF(bytes);
Si se va a devolver un nombre de archivo a Python, use el siguiente código que se proporciona a continuación:
Código #3:
/* Turn a filename into a Python object */ char* filename; int filename_len; PyObject* obj = PyUnicode_DecodeFSDefaultAndSize( filename, filename_len);
Tratar con nombres de archivo de forma portátil es un problema complicado que es mejor dejar en manos de Python. Los nombres de archivo se manejarán de manera que, si uno usa lo anterior en el código de extensión C.
Pasar archivos abiertos a extensiones C –
Código #4: Para convertir un archivo a un descriptor de archivo entero, usePyFile_FromFd()
PyObject* fobj; int fd = PyObject_AsFileDescriptor(fobj); if (fd < 0) { return NULL; }
El descriptor de archivo resultante se obtiene llamando al fileno()
método en fobj . Por lo tanto, cualquier objeto que exponga un descriptor de esta manera debería funcionar (por ejemplo, archivo, socket, etc.). Se puede pasar un descriptor a varias funciones C de bajo nivel que esperan trabajar con archivos. PyFile_FromFd()
se utiliza para convertir un descriptor de archivo entero en un objeto de Python.
Código #5:
/* Existing file descriptor (already open) */ int fd; PyObject* fobj = PyFile_FromFd(fd, "filename", "r", -1, NULL, NULL, NULL, 1);
Los argumentos para PyFile_FromFd()
reflejar los de la función integrada open(). Los valores NULL simplemente indican que se están utilizando las configuraciones predeterminadas para la codificación, los errores y los argumentos de nueva línea.
Publicación traducida automáticamente
Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA