无法从嵌入式解释器导入内置模块(仅限Windows)

时间:2015-08-30 16:14:03

标签: python c++ python-3.x python-embedding

作为抬头,这个问题似乎与

重复

embedding python module error

Embedding Python 3 - no builtins?

但我认为我的问题不同了。我从MSVC编译的C ++应用程序运行Python 3.4解释器,我试图使用ptvsd模块使调试更容易。到目前为止,我已经能够连接到python插件,我从命令行开始没有问题,但我想附加到嵌入在我的C ++应用程序中的python解释器。为此,我一直遵循

的建议

https://github.com/Microsoft/PTVS/wiki/Cross-Platform-Remote-Debugginghttp://blogs.msdn.com/b/cdndevs/archive/2014/10/16/part-5-get-started-with-python-debugging-in-ptvs.aspx

ptvsd模块导入_socket模块,我可以在C:/ Python34 / DLL中清楚地看到它。如果我从命令行调用python34.exe并运行

import ptvsd
ptvsd.enable_attach(None)

我可以通过查看tcp:// localhost:5678找到并附加到该进程。

但是,如果我打电话

PyRun_SimpleString("import ptvsd");

从C ++,我得到一个错误,说无法找到_socket模块。将任何内置python模块导入到我的C ++应用程序中似乎也是如此,尽管我能够从命令行调用python解释器正确导入它们。

我能够执行

PyRun_SimpleString("import sys \n print(sys.path)");

来自我的C ++应用程序,结果显示了C:/ Python34 / DLLs,其中包含_socket.pyd文件。但由于某些原因,当我尝试导入它或导入ptvsd

时,我无法接收它

按照Embedding Python 3 - no builtins?的建议,我跑了

PyObject* pGlobals = PyDict_New();
PyRun_String("import ptvsd", Py_file_input, pGlobals, pGlobals);
PyRun_String("ptvsd.enable_attach(None)", Py_file_input, pGlobals, pGlobals);

这是一个我真正不理解的命令。它实际上使得关于_socket的错误没有被发现消失,但我认为它只是压制它。致电

dir(ptvsd)
来自python的

确实显示了它的功能,但是调用了

PyRun_SimpleString("print(dir(ptvsd))");

没有。我发布的第一个SO链接涉及一个手工构建的模块,该模块无法被互操作者接收,但事实并非如此。该模块位于PYTHONPATH可以找到它的位置,并且它可以被命令行接收(它也可以被Visual Studio IDE的Python工具选中,但是除了这一点之外。)

我无法在Windows上检查python2.7,但是在Linux上,python(2和3)在从c ++解释器导入_socket模块时没有遇到任何问题,因此我希望它能够在只是一个环境问题。

另外,

的输出
print(sys.version)

3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)]
从命令行

3.4.3 (default, Aug 29 2015, 22:43:06) [MSC v.1800 32 bit (Intel)]

来自我的C ++解释器。

对不起,但有人知道出了什么问题吗?我确定我需要通过一些其他工作才能让事情发挥作用,但我不知道它们到底是什么......

为了它的价值,我能够很好地导入系统和数学。我也可以通过

导入我编译的自定义模块
PyImport_AppendInittab(ModuleName.c_str(), _Mod_Init);

我已经尝试过所有测试,无论是否有上述调用。

感谢您的时间。

  • 约翰

0 个答案:

没有答案