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䏿˜¯ä¸€è‡´çš„。 包括编ç �/界é�¢å—节,处ç�†å��å—符,代ç�†è½¬æ�¢å’Œå…¶ä»–å¤�æ�‚情况。