我在系统中安装了 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
見つかった解決策:
問題を見つける手順:
インストールディレクトリにある python.exe を自分のディレクトリにコピーし、python.exe import lxml.html
で実行したところ、問題はありませんでした。 これが、自分で書いた exe と Python の違いです。 exe はおそらく CRT の問題だと思います。
python.exe のマニフェストを開き、依存関係を見つけます <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
etree.pyd のマニフェストを開くと、CRT に依存する情報がないことがわかります。
私の exe は VS2013 で書かれています。マニフェストを開くと、CRT に依存する情報がないことがわかります。
原因推測:
eptree.pyd には CRT 依存関係情報がないため、python.exe にあるメイン プログラムの CRT 依存関係情報を使用するため、読み込みは成功します。 exeファイルに見つからなかったら悲劇です。
解決策:
この問題を解決するには 2 つの方法があります:
VS2013 を使用する代わりに、VS2008 を使用して exe をコンパイルします。コンパイルされたリリース バージョンの exe 内のマニフェストには、python.exe と同様の CRT 依存関係情報が含まれています。
exe のコンパイルにも VS2013 を使用しますが、etree.pyd のマニフェストを変更し、CRT 依存関係情報を追加する必要があります <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
どちらの方法でも問題は解決できます。
少し混乱しています
VS2013 マニフェストには CRT 依存関係の情報がありません。マルチバージョン CRT の競合の問題はどのように解決されますか?それとも、VS2013 はこの情報を他の場所に書き込みますか?
CRT 依存関係情報のない DLL は、推測どおり、本当にメイン プログラムで CRT 依存関係情報を使用しますか?
伊谢尔伦2017-04-17 17:35:57
まずはお電話ください
リーリーlxml が sys.path のロード パスにあるかどうかを確認します
etree は個別にロードできます
まず etree が正常にロードできるかどうかを確認します
試してください
1) PyRun_String
2) PyImport_ImportModule と PySys_SetPath、後者は sys.path を設定できます
3) 1 も 2 も機能しない場合は、lxml/html/__init__ .py を変更する必要があるかもしれません、その中の相対参照の使用を削除します