python2.7 - C++ 嵌入 Python 不能导入 lxml.html 的问题
PHP中文网
PHP中文网 2017-04-17 17:33:57
0
2
393

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

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

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

PHP中文网
PHP中文网

认证0级讲师

全員に返信(2)
阿神

見つかった解決策:

問題を見つける手順:

  1. インストールディレクトリにある python.exe を自分のディレクトリにコピーし、python.exe import 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ファイルに見つからなかったら悲劇です。

解決策:

この問題を解決するには 2 つの方法があります:

  1. VS2013 を使用する代わりに、VS2008 を使用して exe をコンパイルします。コンパイルされたリリース バージョンの exe 内のマニフェストには、python.exe と同様の CRT 依存関係情報が含まれています。

  2. exe のコンパイルにも VS2013 を使用しますが、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
伊谢尔伦

まずはお電話ください

リーリー

lxml が sys.path のロード パスにあるかどうかを確認します
etree は個​​別にロードできます
まず etree が正常にロードできるかどうかを確認します

試してください
1) PyRun_String
2) PyImport_ImportModule と PySys_SetPath、後者は sys.path を設定できます
3) 1 も 2 も機能しない場合は、lxml/html/__init__ .py を変更する必要があるかもしれません、その中の相対参照の使用を削除します

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート