从指向字符串的PyObject中获取char*的方法

4
如何从指向字符串的PyObject中获取char*。例如,这是Python脚本:
Test.Connect("272.22.20.65", 1234)

这是C++代码:
static PyObject* Connect(PyObject *self, PyObject *args)
{
    PyObject* pIP;
    PyObject* pPort;

    if (!PyArg_UnpackTuple(args, "Connect", 2, 2, &pIP, &pPort)) 
    {
        return NULL;
    }

    const char* zIP = GetAsString(pIP);
    long iPort      = PyLong_AsLong(pPort);

我想将那个IP地址作为char*获取(GetAsString是一个虚拟函数:D)。请注意,我正在使用Python 3.1。
附言: 我不认为this问题得到了正确的答案, 因为在Python 3中没有PyStringObject或PyString_AsString。是吗?

@Sven Marnach。它是str类型。但是没有办法从PyUnicode_获取char。我错了吗? - Morpheus
哈哈...Sven Marnach去哪了?当我回复你时,你的评论不见了。 - Morpheus
2个回答

5

谢谢您的回答,但是它并没有起作用。PyBytes_AsString返回了一个NULL。(简单来说,我是这样使用它的:PyBytes_AsString(PyUnicode_AsUTF8String(pObject))) - Morpheus
@Sven Marnach。感谢你的指导。我对Python 3感到困惑,因为用Python 2.x就很简单明了,不是吗? - Morpheus
像那样同时调用这两个函数会导致内存泄漏。 - Ignacio Vazquez-Abrams
我简化了一下以便注释,代码如下。 PyObject* pStrObj = PyUnicode_AsUTF8String(pObject); char* zStr = PyBytes_AsString(pStrObj); char* zStrDup = strdup(zStr); Py_DECREF(pStrObj);希望我做得正确。 - Morpheus

0

这是我的便携式配方,它使用默认编码(如果适用)。它假定您从名为oPyObject*开始。如果您仍然拥有来自函数调用的输入元组,则可以跳过前两行。

PyObject* args = Py_BuildValue("(O)", o);
/* Py_DECREF(o); if o is not borrowed */
if (!args) return 0;
const char* s = 0;
if (!PyArg_ParseTuple(args, "s", &s)) {
  Py_DECREF(args);
  return 0;
}

/* s now points to a const char* - use it, delete args when done */

Py_DECREF(args);

附注:我还没有测试过它,但它应该也适用于旧版本的Python。它没有任何特定版本的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接