C++ 嵌入 Python 不能导入 lxml.html 的问题
我在系统中安装了 Python2.7 和 lxml,通过命令行执行 import lxml.html
没有问题。
但是我在 C++ 中嵌入 Python,调用 PyRun_SimpleString("import lxml.html");
就会提示下面的错误
我已经把 Python 安装目录下的 DLLs
Lib
python27.dll
都拷贝到了我 C++ 程序的目录下了,请问大神这是个什么情况?
回答:
解决方法找到了:
发现问题的步骤:
我把安装目录下的 python.exe 拷贝到我的目录下,用 python.exe 执行
import lxml.html
发现没问题,那就是我自己写的 exe 和 python.exe 有什么不同啦,猜测可能是 CRT 的问题。打开 python.exe 的 manifest,发现依赖
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
打开 etree.pyd 的 manifest,发现没有依赖 CRT 的信息。
我的 exe 是用 VS2013 编写的,打开 manifest,也发现没有依赖 CRT 的信息。
原因猜测:
由于 eptree.pyd 没有依赖 CRT 的信息,它就使用主程序中的 CRT 依赖信息,在 python.exe 中找到了,所以加载成功了。在我的 exe 中没有找到,就悲剧了。
解决方案:
有两种方法解决这个问题:
不使用 VS2013 了,使用 VS2008 编译 exe,编译好的 Release 版本 exe 里面的 manifest 中有 CRT 依赖信息,和 python.exe 没有区别了。
还使用 VS2013编译 exe, 但是需要修改 etree.pyd 的 manifest,添加 CRT 的依赖信息
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
两种方法都能解决问题!
一点疑惑
VS2013 的 manifest 中没有 CRT 的依赖信息了,它是怎么解决多版本 CRT 冲突的问题的?还是说 VS2013 将这些信息写到其它位置了?
没有 CRT 依赖信息的 DLL,真的如猜测的那样使用主程序中的 CRT 依赖信息吗?
回答:
先调用下
import syssys.path
看看lxml是否在sys.path的加载路径里
etree是可以单独加载的
你先确保下etree是否可以正常加载
试试
1) PyRun_String
2) PyImport_ImportModule和PySys_SetPath,后者可以设定sys.path
3) 1和2都不行的话,可能你要改下lxml/html/__init__.py了,把里面的相对引用的用法去掉
以上是 C++ 嵌入 Python 不能导入 lxml.html 的问题 的全部内容, 来源链接: utcz.com/a/163701.html