搜尋

首頁  >  問答  >  主體

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

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

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

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

PHP中文网PHP中文网2888 天前391

全部回覆(2)我來回復

  • 阿神

    阿神2017-04-17 17:35:57

    解決方法找到了:

    發現問題的步驟:

    1. 我把安裝目錄下的python.exe 拷貝到我的目錄下,用python.exe 執行import lxml.html 發現沒問題,那就是我自己寫的exe 和python.exe 有什麼不同啦,猜測可能是CRT 的問題。 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>

    開啟python.exe 的manifest,發現依賴

    打開 etree.pyd 的 manifest,發現沒有依賴 CRT 的資訊。

    1. 我的 exe 是用 VS2013 寫的,打開 manifest,也發現沒有依賴 CRT 的資訊。

    2. 原因猜測:

    由於 eptree.pyd 沒有依賴 CRT 的信息,它就使用主程式中的 CRT 依賴信息,在 python.exe 中找到了,所以加載成功了。在我的 exe 中沒有找到,就悲劇了。 🎜 🎜🎜解決方案:🎜🎜 🎜有兩種方法可以解決這個問題:🎜 🎜 🎜🎜不使用 VS2013 了,使用 VS2008 編譯 exe,編譯好的 Release 版本 exe 裡面的 manifest 中有 CRT 依賴信息,和 python.exe 沒有區別了。 🎜🎜 🎜🎜也使用VS2013編譯exe, 但是需要修改etree.pyd 的manifest,加入CRT 的依賴資訊🎜🎜 🎜 🎜兩種方法都能解決問題! 🎜 🎜🎜一點疑惑🎜🎜 🎜 🎜🎜VS2013 的 manifest 中沒有 CRT 的依賴資訊了,它是怎麼解決多版本 CRT 衝突的問題的?還是說 VS2013 將這些資訊寫到它位置了? 🎜🎜 🎜🎜沒有 CRT 依賴資訊的 DLL,真的如猜測的那樣使用主程式中的 CRT 依賴資訊嗎? 🎜🎜 🎜

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:35:57

    先呼叫下

    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__.pypy了,把裡面的相對了引用的用法去掉

    回覆
    0
  • 取消回覆