Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展
生活随笔
收集整理的這篇文章主要介紹了
Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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中是一致的。
包括編碼/界面字節,處理壞字符,代理轉換和其他復雜情況。
艾伯特(http://www.aibbt.com/)國內第一家人工智能門戶
轉載于:https://www.cnblogs.com/aibbtcom/p/8542790.html
總結
以上是生活随笔為你收集整理的Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HashMap源码浅析
- 下一篇: 老银匠连锁店吴起店电话号码多少?