検索

ホームページ  >  に質問  >  本文

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日前387

全員に返信(2)返信します

  • 阿神

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

    見つかった解決策:

    問題を見つける手順:

    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
  • 伊谢尔伦

    伊谢尔伦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 を変更する必要があるかもしれません、その中の相対参照の使用を削除します

    返事
    0
  • キャンセル返事