Jump to content
Korean Random
Pavel3333

[1.0.1 CT/XFW 930] [Invalid] XFW Native: краш при вызове PyImport_ImportModule("BigWorld")

Recommended Posts

Наблюдаю безлоговые вылеты при вызове 

PyImport_ImportModule("BigWorld")

Однако код работает при вызове

PyImport_AddModule("BigWorld")

Во втором случае при выполнении кода, который пытается создать модель по заданному пути path (BigWorld.Model(path)):

static PyObject* test(PyObject *self, PyObject *args)
{
    char* path;

    PyObject *BigWorld_Module, *ModelFunc, *Args, *Path, *Model;

    if (!PyArg_ParseTuple(args, "s", &path)) {
        Py_INCREF(Py_None);
        return Py_None;
    }

    BigWorld_Module = PyImport_AddModule("BigWorld");

    Py_INCREF(BigWorld_Module);

    if (!BigWorld_Module) {
        PySys_WriteStdout("Module not found\n");

        Py_DECREF(BigWorld_Module);

        Py_INCREF(Py_None);
        return Py_None;
    }

    ModelFunc = PyObject_GetAttrString(BigWorld_Module, "Model");

    Py_INCREF(ModelFunc);

    Py_DECREF(BigWorld_Module);

    if (ModelFunc && PyCallable_Check(ModelFunc)) {

        Args = PyTuple_New(1);

        Path = PyString_FromString(path);

        PyTuple_SetItem(Args, 0, Path);

        Py_DECREF(Path);

        Model = PyObject_CallObject(ModelFunc, Args);

        Py_DECREF(Args);
        Py_DECREF(ModelFunc);

        return Model;

    }
    
    Py_INCREF(Py_None);
    return Py_None;
};

Также наблюдается безлоговый вылет.

 

Импорт сторонних модулей и выполнение функций в них а-ля json.loads('{}') выполняется корректно.

 

Использую XFW 7.6.0.930 & XFW native 1.0.9.00039

 

 

static PyObject* trj_model(PyObject *self, PyObject *args)
{
    char* path;

    PyObject *BigWorld_Module, *ModelFunc;//, *Args, *Path, *Model;

    if (!PyArg_ParseTuple(args, "s", &path)) {
        Py_INCREF(Py_None);
        return Py_None;
    }

    BigWorld_Module = PyImport_AddModule("BigWorld");

    Py_INCREF(BigWorld_Module);

    if (!BigWorld_Module) {
        Py_DECREF(BigWorld_Module);

        Py_INCREF(Py_None);
        return Py_None;
    }

    ModelFunc = PyObject_GetAttrString(BigWorld_Module, "Model");

    Py_INCREF(ModelFunc);

    Py_DECREF(BigWorld_Module);

    if (ModelFunc && PyCallable_Check(ModelFunc)) {
        return ModelFunc;
    }

    Py_INCREF(Py_None);
    return Py_None;
};

К слову, вот такой код работает, если вызывать его из питона как trj.model(path)(path), то есть в предыдущем листинге вылетает на стадии CallObject

PS: TypeError: can't set attributes of built-in/extension type 'BigWorld.Model'

Странно, моделька на уровне Си создалась, однако присвоить атрибут position на уровне питона нельзя :(

Edited by Mixaill

Share this post


Link to post

Short link
Share on other sites
1 hour ago, Pavel3333 said:

Py_INCREF(Py_None)

return Py_None;

зачем?

есть же Py_RETURN_NONE;

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites
PyObject* test(PyObject *self, PyObject *args)
{
    char* path;
    if (!PyArg_ParseTuple(args, "s", &path)) {
      	PyErr_SetString(PyExc_ArgumentException, "incorrect input");
        return nullptr;
    }

    PyObject* Model = PyObject_CallMethod(PyImport_AddModule("BigWorld"), "Model", "(s)", path)
    if(Model == nullptr)
        Py_RETURN_NONE;
        
    return Model;
};

что-то такое. BigWorld всегда есть, поэтому проверять на успех не имеет смысла.

Edited by Mixaill
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@Mixaill спасибо!

@Mixaill еще раз благодарю, код полностью рабочий :)

 

осталось только понять, чего я не так намутил в том коде... наверное, это как-то связано с Py_INCREF() / Py_DECREF()

Share this post


Link to post

Short link
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...