开发者社区> 问答> 正文

传递文件名给C扩展

你需要向C库函数传递文件名,但是需要确保文件名根据系统期望的文件名编码方式编码过。

展开
收起
哦哦喔 2020-04-17 18:16:24 3088 0
1 条回答
写回答
取消 提交回答
  • 写一个接受一个文件名为参数的扩展函数,如下这样:
    
    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);
    
    2020-04-17 18:16:35
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载