我在系统中安装了 Python2.7 和 lxml,通过命令行执行 import lxml.html 没有问题。
import lxml.html
但是我在 C++ 中嵌入 Python,调用 PyRun_SimpleString("import lxml.html"); 就会提示下面的错误
PyRun_SimpleString("import lxml.html");
我已经把 Python 安装目录下的 DLLs Lib python27.dll 都拷贝到了我 C++ 程序的目录下了,请问大神这是个什么情况?
DLLs
Lib
python27.dll
认证0级讲师
解決方法找到了:
發現問題的步驟:
我把安裝目錄下的python.exe 拷貝到我的目錄下,用python.exe 執行import lxml.html 發現沒問題,那就是我自己寫的exe 和python.exe 有什麼不同啦,猜測可能是CRT 的問題。 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>
<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>
打開 etree.pyd 的 manifest,發現沒有依賴 CRT 的資訊。
原因猜測:
先呼叫下
import sys sys.path
看看lxml是否在sys.path的載入路徑裡etree是可以單獨載入的你先確保下etree是否可以正常載入
試試1) PyRun_String 2) PyImport_ImportModule和PySys_SetPath,後者可以設定sys.path3) 1和2都不行的話,可能你要改下lxml/html/__init__.pypy了,把裡面的相對了引用的用法去掉
解決方法找到了:
我把安裝目錄下的python.exe 拷貝到我的目錄下,用python.exe 執行
import lxml.html
發現沒問題,那就是我自己寫的exe 和python.exe 有什麼不同啦,猜測可能是CRT 的問題。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 依賴資訊嗎? 🎜🎜 🎜先呼叫下
看看lxml是否在sys.path的載入路徑裡
etree是可以單獨載入的
你先確保下etree是否可以正常載入
試試
1) PyRun_String
2) PyImport_ImportModule和PySys_SetPath,後者可以設定sys.path
3) 1和2都不行的話,可能你要改下lxml/html/__init__.pypy了,把裡面的相對了引用的用法去掉