我在系统中安装了 Python2.7 和 lxml,通过命令行执行 import lxml.html
没有问题。
但是我在 C++ 中嵌入 Python,调用 PyRun_SimpleString("import lxml.html");
就会提示下面的错误
我已经把 Python 安装目录下的 DLLs
Lib
python27.dll
都拷贝到了我 C++ 程序的目录下了,请问大神这是个什么情况?
先调用下
import sys
sys.path
看看lxml是否在sys.path的加载路径里
etree是可以单独加载的
你先确保下etree是否可以正常加载
试试
1) PyRun_String
2) PyImport_ImportModule和PySys_SetPath,后者可以设定sys.path
3) 1和2都不行的话,可能你要改下lxml/html/__init__.py了,把里面的相对引用的用法去掉
3 回答2k 阅读✓ 已解决
4 回答4.4k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
解决方法找到了:
我把安装目录下的 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 依赖信息吗?