我使用 Python 2 API 封装了很多 C++(由于各种技术原因,我不能使用 swig 或 boost.python 之类的东西)。当我必须将一个字符串(通常是一个路径,总是 ASCII)传递给 C/C++ 时,我使用这样的东西:
std::string file_name = PyString_AsString(py_file_name);
if (PyErr_Occurred()) return NULL;
现在我正在考虑更新到PyString_*
不存在方法的 Python 3。我找到了一个解决方案,说我应该做这样的事情:
PyObject* bytes = PyUnicode_AsUTF8String(py_file_name);
std::string file_name = PyBytes_AsString(bytes);
if (PyErr_Occurred()) return NULL;
Py_DECREF(bytes);
然而,这是行数的两倍,而且看起来有点难看(更不用说如果我忘记了最后一行,它可能会导致内存泄漏)。
另一种选择是重新定义python函数以对bytes
对象进行操作,并像这样调用它们
def some_function(path_name):
_some_function(path_name.encode('utf8'))
这并不可怕,但它确实需要每个函数的 python 端包装器。
有没有更清洁的方法来处理这个问题?