我在系统中安装了 Python2.7 和 lxml,通过命令行执行 import lxml.html 没有问题。
import lxml.html
但是我在 C++ 中嵌入 Python,调用 PyRun_SimpleString("import lxml.html"); 就会提示下面的错误
PyRun_SimpleString("import lxml.html");
我已经把 Python 安装目录下的 DLLs Lib python27.dll 都拷贝到了我 C++ 程序的目录下了,请问大神这是个什么情况?
DLLs
Lib
python27.dll
认证0级讲师
見つかった解決策:
問題を見つける手順:
インストールディレクトリにある 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>
<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 依存関係情報を使用しますか?
まずはお電話ください
lxml が sys.path のロード パスにあるかどうかを確認しますetree は個別にロードできますまず etree が正常にロードできるかどうかを確認します
試してください1) PyRun_String 2) PyImport_ImportModule と PySys_SetPath、後者は sys.path を設定できます3) 1 も 2 も機能しない場合は、lxml/html/__init__ .py を変更する必要があるかもしれません、その中の相対参照の使用を削除します
見つかった解決策:
インストールディレクトリにある 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 依存関係情報を使用しますか?
まずはお電話ください
リーリーlxml が sys.path のロード パスにあるかどうかを確認します
etree は個別にロードできます
まず etree が正常にロードできるかどうかを確認します
試してください
1) PyRun_String
2) PyImport_ImportModule と PySys_SetPath、後者は sys.path を設定できます
3) 1 も 2 も機能しない場合は、lxml/html/__init__ .py を変更する必要があるかもしれません、その中の相対参照の使用を削除します