使用PyCXX将模块加载到嵌入式Python运行时中
Load module into embedded Python runtime using PyCXX
我正在使用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调试/输出窗口中放入一个功能齐全的Python提示。
接下来,我将公开一个测试C++类,以便它在Python中可见。有一个range
类是为此目的编写的:
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"的简单演示模块,其中包含:
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编译到一个库中(OSX上的.so),并将其放在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告诉我使用CCD_ 5。
现在我应该可以从提示中看到这个模块了。它被称为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'])
它似乎不起作用。
我错过了什么?
我将留下这个问题,而不是删除它,因为它包含了对未来任何PyCXX浏览器有用的基石。
相关文章:
- 如何强制嵌入式python使用与命令行相同的sys.path?
- c++ 上的嵌入式 python.更改调试器时出错
- 多线程嵌入式 Python.这是对的吗?
- C++ 中的嵌入式 Python 无法执行 pygame
- 嵌入式python如何调用C++类的函数?
- import_array在嵌入式Python C API的调试版本中不起作用
- C++中的嵌入式python:importerror import numpy.core.multiarray
- 估计C 中嵌入式Python脚本的进度
- 程序在Windows中的DLL边界上使用嵌入式Python/C 代码崩溃
- 嵌入式Python问题
- 在嵌入式Python C 应用中导入Numpy
- 调度嵌入式 Python 进程
- 通过嵌入式 Python 调用C++代码
- C++中带有嵌入式python模块的多线程
- 如何使用C++的字节码优化初始化嵌入式 Python 解释器
- 将交互式控制台附加到嵌入式python脚本
- 用c++对象的全局实例扩展嵌入式python解释器
- 传递Tuple嵌入式Python
- 嵌入式Python找不到一些模块(ctypes,..)
- 如何允许通过嵌入式 Python 解释器中调用的脚本导入第三方库