Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展
生活随笔
收集整理的這篇文章主要介紹了
Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
15.17 傳遞文件名給C擴(kuò)展?
問題?
你需要向C庫(kù)函數(shù)傳遞文件名,但是需要確保文件名根據(jù)系統(tǒng)期望的文件名編碼方式編碼過。
解決方案?
寫一個(gè)接受一個(gè)文件名為參數(shù)的擴(kuò)展函數(shù),如下這樣:
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; }如果你已經(jīng)有了一個(gè) PyObject * ,希望將其轉(zhuǎn)換成一個(gè)文件名,可以像下面這樣做:
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);討論?
以可移植方式來(lái)處理文件名是一個(gè)很棘手的問題,最后交由Python來(lái)處理。
如果你在擴(kuò)展代碼中使用本節(jié)的技術(shù),文件名的處理方式和和Python中是一致的。
包括編碼/界面字節(jié),處理壞字符,代理轉(zhuǎn)換和其他復(fù)雜情況。
艾伯特(http://www.aibbt.com/)國(guó)內(nèi)第一家人工智能門戶
轉(zhuǎn)載于:https://www.cnblogs.com/aibbtcom/p/8542790.html
總結(jié)
以上是生活随笔為你收集整理的Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HashMap源码浅析
- 下一篇: python-configparser生