【问题标题】:How to get a char* from a PyObject which points to a string如何从指向字符串的 PyObject 中获取 char*
【发布时间】:2012-03-27 19:10:06
【问题描述】:

如何从指向字符串的 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 中没有 PyStringObjectPyString_AsString。不是吗?

【问题讨论】:

  • @Sven Marnach。它是海峡。但是没有办法从 PyUnicode_* 获取 char*。我错了吗?
  • 大声笑...斯文·马纳赫在哪里?当我回复你时,你的评论不见了

标签: python python-3.x python-c-api


【解决方案1】:

首先是 encode it,然后是 retrieve it。不要忘记减少临时的。

【讨论】:

  • 感谢您的回答,但它不起作用。 PyBytes_AsString 正在返回一个 NULL。 (简而言之,这就是我使用它的方式,PyBytes_AsString(PyUnicode_AsUTF8String(pObject)))
  • @Sven Marnach。谢谢你的观点。我对python3感到困惑,使用python2x很简单,不是吗。
  • 这样调用两个函数会导致内存泄漏。
  • 我简化了评论,是这样的。 PyObject* pStrObj = PyUnicode_AsUTF8String(pObject); char* zStr = PyBytes_AsString(pStrObj); char* zStrDup = strdup(zStr); Py_DECREF(pStrObj);希望我以正确的方式做到了。
【解决方案2】:

这是我的便携式配方,它使用适用的默认编码。它假定您以PyObject* 开头,名为o。如果您仍有来自函数调用的输入元组,则可以跳过前 2 行。

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);

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

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 2017-10-29
    • 2011-07-18
    • 2012-12-11
    • 2015-05-19
    • 2021-11-30
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多