作为抬头,这个问题似乎与
重复Embedding Python 3 - no builtins?
但我认为我的问题不同了。我从MSVC编译的C ++应用程序运行Python 3.4解释器,我试图使用ptvsd模块使调试更容易。到目前为止,我已经能够连接到python插件,我从命令行开始没有问题,但我想附加到嵌入在我的C ++应用程序中的python解释器。为此,我一直遵循
的建议https://github.com/Microsoft/PTVS/wiki/Cross-Platform-Remote-Debugging 和 http://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);
我已经尝试过所有测试,无论是否有上述调用。
感谢您的时间。