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

2024-05-20 20:21:21 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题看起来可能是一个重复的问题

embedding python module error

Embedding Python 3 - no builtins?

但我认为我的问题是不同的。我正在从一个MSVC编译的C++应用程序运行Python 3.4解释器,并且我尝试使用PTVSD模块来调试更容易。到目前为止,我已经能够连接到Python Ipter,我从命令行开始,没有问题,但我想附加到一个嵌入在我的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模块导入了\u套接字模块,我可以在C:/Python34/dll中清楚地看到这一点。如果我从命令行调用python34.exe并运行

import ptvsd
ptvsd.enable_attach(None)

我可以通过查看tcp://localhost:5678。在

但是,如果我打电话

^{pr2}$ <>从C++中,我发现一个错误,不能找到“子套接字”模块。对于将任何内置的Python模块导入到C++应用程序中,这是同样的情况,尽管我能够正确地从命令行调用的Python解释器导入它们。在

我能执行

PyRun_SimpleString("import sys \n print(sys.path)");
< >我的C++应用程序,结果显示了c:/Python 34 /dll,其中插座.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);

我真的不明白这个命令。它实际上使“找不到插座”的错误消失了,但我认为它只是抑制了它。呼叫

dir(ptvsd)

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

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

没有。我发布的第一个SO链接处理的是一个手工构建的模块,它不能被interpeter接收,但这里不是这样。该模块位于PYTHONPATH可以找到的地方,并且可以通过命令行找到它(它也可以由Python工具for visualstudioide获取,但这不是重点。)

我无法在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++解释器。在

很抱歉,但是有人知道怎么回事吗?我确定我还需要经历一些其他的困难才能让事情顺利进行,但我不知道它们是什么。。。在

不管怎样,我可以很好地导入sys和math。我还可以通过一个自定义模块来编译

PyImport_appendInittab(ModuleName.c_str(), _Mod_Init);

我试过我所有的测试,有没有上面的电话。在

谢谢你抽出时间。在

  • 约翰

Tags: 模块no命令行importcom应用程序sysembedding