Maison > Questions et réponses > le corps du texte
我在系统中安装了 Python2.7 和 lxml,通过命令行执行 import lxml.html
没有问题。
但是我在 C++ 中嵌入 Python,调用 PyRun_SimpleString("import lxml.html");
就会提示下面的错误
我已经把 Python 安装目录下的 DLLs
Lib
python27.dll
都拷贝到了我 C++ 程序的目录下了,请问大神这是个什么情况?
阿神2017-04-17 17:35:57
Solution trouvée :
Étapes pour trouver le problème :
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.
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>
Ouvrez le manifeste de etree.pyd et constatez qu'il n'y a aucune information qui dépend du CRT.
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 :
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.
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
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 ?
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é ?
伊谢尔伦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