recherche

Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours388

répondre à tous(2)je répondrai

  • 阿神

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

    Solution trouvée :

    Étapes pour trouver le problème :

    1. J'ai copié le python.exe dans le répertoire d'installation dans mon répertoire et je l'ai exécuté avec python.exe import lxml.html et j'ai constaté qu'il n'y avait aucun problème. C'est la différence entre l'exe que j'ai écrit moi-même et python. exe. Je suppose que cela peut être un problème CRT.

    2. Ouvrez le manifeste de python.exe et recherchez les dépendances <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

    3. Ouvrez le manifeste de etree.pyd et constatez qu'il n'y a aucune information qui dépend du CRT.

    4. Mon exe est écrit en VS2013. Lorsque j'ouvre le manifeste, je constate également qu'il n'y a aucune information qui repose sur CRT.

    Parce que devinez :

    Puisque eptree.pyd n'a pas d'informations de dépendance CRT, il utilise les informations de dépendance CRT dans le programme principal, qui se trouvent dans python.exe, le chargement est donc réussi. C'est une tragédie si on ne le trouve pas dans mon exe.

    Solution :

    Il existe deux manières de résoudre ce problème :

    1. Au lieu d'utiliser VS2013, utilisez VS2008 pour compiler l'exe. Le manifeste dans la version compilée de l'exe contient des informations de dépendance CRT, qui ne sont pas différentes de python.exe.

    2. Utilisez également VS2013 pour compiler l'exe, mais vous devez modifier le manifeste de etree.pyd et ajouter des informations de dépendance CRT <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

    Les deux méthodes peuvent résoudre le problème !

    Un peu confus

    1. Il n'y a aucune information sur la dépendance CRT dans le manifeste VS2013. Comment résout-il le problème des conflits CRT multi-versions ? Ou VS2013 écrit-il ces informations à d'autres emplacements ?

    2. Une DLL sans informations de dépendance CRT utilise-t-elle réellement les informations de dépendance CRT dans le programme principal comme deviné ?

    répondre
    0
  • 伊谢尔伦

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

    Appelez d'abord

    import sys
    sys.path

    Vérifiez si lxml est dans le chemin de chargement de sys.path
    etree peut être chargé séparément
    Vous devez d'abord vous assurer si etree peut être chargé normalement

    Essayez
    1) PyRun_String
    2) PyImport_ImportModule et PySys_SetPath, ce dernier peut définir sys.path
    3) Si ni 1 ni 2 ne fonctionnent, vous devrez peut-être changer lxml/html/__init__ .py , supprimez l'utilisation de références relatives

    répondre
    0
  • Annulerrépondre