찾다

 >  Q&A  >  본문

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일 전389

모든 응답(2)나는 대답할 것이다

  • 阿神

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

    해결책 발견:

    문제를 찾는 단계:

    1. 설치 디렉터리에 있는 python.exe를 내 디렉터리에 복사하고 python.exeimport lxml.html로 실행해 보니 문제가 없는 걸 확인했습니다. 그게 제가 직접 작성한 exe와 Python의 차이점입니다. exe.CRT 문제인 것 같아요.

    2. python.exe의 매니페스트를 열고 종속성을 찾습니다. <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

    3. etree.pyd의 매니페스트를 열고 CRT에 의존하는 정보가 없음을 확인합니다.

    4. 제 exe는 VS2013으로 작성되어 있는데 매니페스트를 열어보니 CRT에 의존하는 정보도 없는 것 같습니다.

    원인 추측:

    eptree.pyd에는 CRT 종속성 정보가 없기 때문에 python.exe에 있는 기본 프로그램의 CRT 종속성 정보를 사용하므로 로딩에 성공합니다. 내 exe에서 발견되지 않으면 비극입니다.

    해결책:

    이 문제를 해결하는 방법에는 두 가지가 있습니다.

    1. VS2013을 사용하는 대신 VS2008을 사용하여 exe를 컴파일합니다. 컴파일된 릴리스 버전 exe의 매니페스트에는 python.exe와 다르지 않은 CRT 종속성 정보가 있습니다.

    2. 또한 VS2013을 사용하여 exe를 컴파일하지만 etree.pyd의 매니페스트를 수정하고 CRT 종속성 정보를 추가해야 합니다<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

    두 가지 방법 모두 문제를 해결할 수 있습니다!

    조금 혼란스럽습니다

    1. VS2013 매니페스트에는 CRT 종속성 정보가 없습니다. 다중 버전 CRT 충돌 문제를 어떻게 해결합니까? 아니면 VS2013이 이 정보를 다른 위치에 기록합니까?

    2. CRT 종속성 정보가 없는 DLL이 실제로 추측한 대로 메인 프로그램의 CRT 종속성 정보를 사용합니까?

    회신하다
    0
  • 伊谢尔伦

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

    전화 먼저

    으아악

    sys.path 로딩 경로에 lxml이 있는지 확인
    etree는 별도로 로딩 가능
    먼저 etree가 정상적으로 로딩되는지 확인하세요

    <… , 상대 참조의 사용을 제거하세요

    회신하다
    0
  • 취소회신하다