C++ 嵌入 Python 不能导入 lxml.html 的问题

我在系统中安装了 Python2.7 和 lxml,通过命令行执行 import lxml.html 没有问题。
图片描述

但是我在 C++ 中嵌入 Python,调用 PyRun_SimpleString("import lxml.html"); 就会提示下面的错误
图片描述

我已经把 Python 安装目录下的 DLLsLibpython27.dll 都拷贝到了我 C++ 程序的目录下了,请问大神这是个什么情况?

回答:

解决方法找到了:

发现问题的步骤:

  1. 我把安装目录下的 python.exe 拷贝到我的目录下,用 python.exe 执行 import lxml.html 发现没问题,那就是我自己写的 exe 和 python.exe 有什么不同啦,猜测可能是 CRT 的问题。

  2. 打开 python.exe 的 manifest,发现依赖 <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

  3. 打开 etree.pyd 的 manifest,发现没有依赖 CRT 的信息。

  4. 我的 exe 是用 VS2013 编写的,打开 manifest,也发现没有依赖 CRT 的信息。

原因猜测:

由于 eptree.pyd 没有依赖 CRT 的信息,它就使用主程序中的 CRT 依赖信息,在 python.exe 中找到了,所以加载成功了。在我的 exe 中没有找到,就悲剧了。

解决方案:

有两种方法解决这个问题:

  1. 不使用 VS2013 了,使用 VS2008 编译 exe,编译好的 Release 版本 exe 里面的 manifest 中有 CRT 依赖信息,和 python.exe 没有区别了。

  2. 还使用 VS2013编译 exe, 但是需要修改 etree.pyd 的 manifest,添加 CRT 的依赖信息 <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

两种方法都能解决问题!

一点疑惑

  1. VS2013 的 manifest 中没有 CRT 的依赖信息了,它是怎么解决多版本 CRT 冲突的问题的?还是说 VS2013 将这些信息写到其它位置了?

  2. 没有 CRT 依赖信息的 DLL,真的如猜测的那样使用主程序中的 CRT 依赖信息吗?

回答:

先调用下

import sys

sys.path

看看lxml是否在sys.path的加载路径里
etree是可以单独加载的
你先确保下etree是否可以正常加载

clipboard.png

试试
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

回到顶部