【问题标题】:Exposing a new type to python at run time在运行时向 python 公开一个新类型
【发布时间】:2011-06-27 22:10:27
【问题描述】:

我已经完成并定义了我的新类型,将它们存储在 pytypeobject 中并调用了以下函数(在初始化解释器之后):

PyType_Ready(); //这需要我定义的类型

PyModule_AddObject(); //这会将定义的类型添加到我使用创建的模块中 PyModule_Create();

现在,当我尝试使用我定义的类型时,解释器说它不存在,所以我假设必须采取另一个步骤才能在运行时添加类型,或者还有其他一些我必须采取的步骤来实现这一目标。

任何帮助将不胜感激。

Python 语法错误:

Traceback (most recent call last):
  File "testscript.py", line 1, in <module>
    import Bound
ImportError: No module named Bound

测试脚本内容:

import Bound
l = Bound.Foo()

Bound 是我定义模块的名称,Foo 是我试图定义的类型,用于测试目的。

【问题讨论】:

  • 请发布您收到的确切错误消息。
  • 还要指出您试图用来访问该类型的确切语法。
  • 或者提供一些类的调试信息:P
  • 我添加了调试信息,但我看不出它有什么帮助。要么你知道如何在运行时将用户定义的类型添加到 python,要么你不知道。对于知道如何操作的人来说,我提供的信息应该足够了。
  • @Dane:“没有名为 Bound 的模块”意味着它根本看不到您编译的模块。那是在它甚至试图寻找Foo之前。所以你需要制定一个你可以先导入的模块。

标签: python c module runtime python-extensions


【解决方案1】:

所以我想出了我需要做什么,我必须在Py_Initialize之前调用一个函数,

PyImport_AppendInittab( ModuleName, ModuleInitFunction );

这会将模块名称添加到 python 模块字典中,因此当您调用 import ModuleName 时,如果是第一次,它将调用 ModuleInitFunction(我有,但没有在正确的地方使用) ,它创建了模块。现在,在创建模块之后,您可以继续在运行时向它添加类型,这就是我所做的。

现在我可以在运行时成功地将用户定义的 C++ 类绑定到 python,然后在我们的游戏引擎的脚本中使用它们。现在我正在解决运行时的问题,但它应该会在接下来的几天内启动并运行。无论如何,如果其他人决定将 python 嵌入到游戏引擎中进行脚本编写,我相信我可以提供帮助。

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多