使用PyCXX将模块加载到嵌入式Python运行时中

2024-07-08 10:27:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用PyCXX来创建一个围绕嵌入的Python运行时的C++包装器。在

PyCXX似乎没有可执行文件的示例,所以我试图修改现有的示例代码。在

我可以轻松启动并运行Python解释器:

extern "C" int Py_Main(int argc, PY_CHAR** argv);

int main(int argc, const char * argv[])
{
    Py_Initialize();
    PyRun_SimpleString( "print('hello world') \n" );
    Py_Finalize();
}

这将在我的Xcode debug/output窗口中放置一个功能齐全的Python提示符。在

下,我公开了一个测试C++类,以便它在Python中变得可见。有一个range类是为此而编写的:

^{pr2}$

好吧,那也行。在

但现在我要加载一个模块。在

有一个简单的演示模块叫做简单.cxx“,其中包含:

extern "C" EXPORT_SYMBOL PyObject *PyInit_simple()
{
    static simple_module* simple = new simple_module;
    return simple->module().ptr();
}

并且simple_module类派生自PyCXX的ExtensionModule类,该类派生自一个ExtensionModuleBase类,该类具有初始值:

void ExtensionModuleBase::initialize( const char *module_doc )
{
    memset( &m_module_def, 0, sizeof( m_module_def ) );

    m_module_def.m_name = const_cast<char *>( m_module_name.c_str() );
    m_module_def.m_doc = const_cast<char *>( module_doc );
    m_module_def.m_methods = m_method_table.table();
    // where does module_ptr get passed in?

    m_module = PyModule_Create( &m_module_def );
}

如果我理解正确的话,我们应该将这个.cxx编译到一个库(.so on OS X),并将它放在Python的搜索路径中的某个地方。在

但是它应该可以在不需要编译单独的库的情况下工作。这就是我要做的。在

extern "C"
{
    int Py_Main(int argc, PY_CHAR** argv);
    PyObject *PyInit_example();
}

int main(int argc, const char * argv[])
{
    PyImport_appendInittab("spam", &PyInit_example);

    Py_Initialize();
    Py_Main(argc, (PY_CHAR**)argv); // wrong but works(!)
    Py_Finalize();
}

我使用这里的文档:https://docs.python.org/3.4/extending/embedding.html,它告诉我使用PyImport_AppendInittab。在

现在我应该可以从提示符看到这个模块了。它被称为simple。在

>>> import simple
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'simple'

>>> import sys
>>> sys.modules.keys()
dict_keys(['_weakrefset', 'copyreg', 'posix', '_io', 'encodings.aliases', '__main__', '_frozen_importlib', '_sysconfigdata', 'sys', 'encodings.utf_8', '_osx_support', 'marshal', 'builtins', 'encodings.ascii', 'abc', 'stat', '_weakref', 'atexit', '_bootlocale', 'rlcompleter', '_collections_abc', 're', 'readline', '_thread', 'zipimport', 'sre_constants', '_sitebuiltins', 'encodings.latin_1', '_sre', 'codecs', '_codecs', 'sysconfig', '_locale', 'posixpath', '_stat', 'encodings', 'genericpath', 'os.path', 'site', 'sitecustomize', 'sre_parse', 'io', 'os', 'errno', '_warnings', 'signal', 'sre_compile', '_imp'])

好像没用。在

我错过了什么?在


Tags: pymaindefexternsimpleintmodulesre
1条回答
网友
1楼 · 发布于 2024-07-08 10:27:15

我是一只黑猩猩。”“垃圾邮件”需要用“简单”来代替,它是有效的。在

我将留下这个问题,而不是删除它,因为它包含了对未来任何PyCXX浏览器有用的步骤。在

相关问题 更多 >

    热门问题