Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PyCXX将模块加载到嵌入式Python运行时 我使用在一个嵌入的Python运行时创建一个C++包装器。_Python_C++_Embedding_Pycxx - Fatal编程技术网

使用PyCXX将模块加载到嵌入式Python运行时 我使用在一个嵌入的Python运行时创建一个C++包装器。

使用PyCXX将模块加载到嵌入式Python运行时 我使用在一个嵌入的Python运行时创建一个C++包装器。,python,c++,embedding,pycxx,Python,C++,Embedding,Pycxx,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(); } 这将在我的X

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中变得可见。为此编写了一个

范围
类:

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_模块
类派生自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 );
}
我在这里使用文档:它告诉我使用
PyImport\u 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'])
>>导入简单
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为“simple”的模块
>>>导入系统
>>>sys.modules.keys()
口述键([“u weakrefset”、“copyreg”、“posix”、“encodings.alias”、“u main”、“u freezed”、“importlib”、“u sysconfigdata”、“sys”、“encodings.utf\u 8”、“u osx\u support”、“封送”、“内置”、“encodings.ascii”、“abc”、“stat”、“u weakref”、“atexit”、“u bootlocale”、“recompleter”、“u collections”、“u abc”、“re readline”、“u threadline”、“u线程”、“zisre”、“pimport”和“si”tebuiltins、encodings.latin_1’、‘sre’、‘codecs’、‘codecs’、‘sysconfig’、‘locale’、‘posixpath’、‘stat’、‘encodings’、‘genericpath’、‘os.path’、‘site’、‘sitecustomize’、‘sre_parse’、‘io’、‘os’、‘errno’、‘警告’、‘信号’、‘sre_compile’、‘imp’)
这似乎不起作用

我遗漏了什么?

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

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

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();
}
>>> 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'])