首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PyCXX将模块加载到嵌入式Python运行时

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

Stack Overflow用户
提问于 2014-10-12 12:34:05
回答 1查看 608关注 0票数 0

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

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

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

代码语言:javascript
复制
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调试/输出窗口中放置了一个功能齐全的Python提示符。

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

代码语言:javascript
复制
extern "C" int Py_Main(int argc, PY_CHAR** argv);

int main(int argc, const char * argv[])
{
    Py_Initialize();
    range::init_type();

    //test_extension_object();  <-- test-suite for 'range'

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

    /*
     This will launch a Python prompt in Xcode's output window
     You can type:
         >>> x = range(1,20,3)
         >>> i = [a for a in x]
         >>> i
         [1, 4, 7, 10, 13, 16, 19]
         >>> quit()
         Program ended with exit code: 0
     */
    Py_Finalize();

}

好的,所以这也有效。

但现在我正试着加载一个模块。

有一个名为"simple.cxx“的简单演示模块,它包含:

代码语言:javascript
复制
extern "C" EXPORT_SYMBOL PyObject *PyInit_simple()
{
    static simple_module* simple = new simple_module;
    return simple->module().ptr();
}

simple_module类来自PyCXX的ExtensionModule类,该类来自具有初始化器的ExtensionModuleBase类:

代码语言:javascript
复制
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编译成一个库( OS上的.so),并将它放在Python的搜索路径中。

但是,不需要编译一个单独的库,就可以让它正常工作。这就是我想做的。

代码语言:javascript
复制
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

代码语言:javascript
复制
>>> 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'])

这似乎不起作用。

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-13 01:19:28

我是只黑猩猩。“垃圾邮件”需要替换为“简单”,它可以工作。

我将保留这个问题,而不是删除它,因为它包含了任何未来的PyCXX浏览器的有用的垫脚石。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26325176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档