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

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

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

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

PHP中文网
PHP中文网

认证0级讲师

membalas semua(2)
阿神

Penyelesaian ditemui:

Langkah untuk mencari masalah:

  1. Saya menyalin python.exe dalam direktori pemasangan ke direktori saya dan melaksanakannya dengan python.exe import lxml.html dan mendapati bahawa tiada masalah Itulah perbezaan antara exe yang saya tulis sendiri dan python. exe. Saya rasa ia mungkin masalah CRT.

  2. Buka manifes python.exe dan cari kebergantungan <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

  3. Buka manifes etree.pyd dan ketahui bahawa tiada maklumat yang bergantung pada CRT.

  4. Exe saya ditulis dalam VS2013. Apabila saya membuka manifes, saya juga mendapati tiada maklumat yang bergantung pada CRT.

Sebab tekaan:

Memandangkan eptree.pyd tidak mempunyai maklumat pergantungan CRT, ia menggunakan maklumat pergantungan CRT dalam program utama, yang terdapat dalam python.exe, jadi pemuatan berjaya. Ia adalah tragedi jika ia tidak dijumpai dalam exe saya.

Penyelesaian:

Terdapat dua cara untuk menyelesaikan masalah ini:

  1. Daripada menggunakan VS2013, gunakan VS2008 untuk menyusun exe Manifes dalam versi Keluaran yang disusun mempunyai maklumat pergantungan CRT, yang tidak berbeza daripada python.exe.

  2. Juga gunakan VS2013 untuk menyusun exe, tetapi anda perlu mengubah suai manifes etree.pyd dan menambah maklumat pergantungan CRT <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

Kedua-dua kaedah boleh menyelesaikan masalah!

Sedikit keliru

  1. Tiada maklumat pergantungan CRT dalam manifes VS2013 Bagaimanakah ia menyelesaikan masalah konflik CRT berbilang versi? Atau adakah VS2013 menulis maklumat ini ke lokasi lain?

  2. Adakah DLL tanpa maklumat pergantungan CRT benar-benar menggunakan maklumat pergantungan CRT dalam program utama seperti yang diduga?

伊谢尔伦

Panggil dahulu

import sys
sys.path

Semak sama ada lxml berada dalam laluan pemuatan sys.path
etree boleh dimuatkan secara berasingan
Anda mula-mula pastikan sama ada etree boleh dimuatkan secara normal

Cuba
1) PyRun_String
2) PyImport_ImportModule dan PySys_SetPath, yang kedua boleh menetapkan sys.path
3) Jika 1 atau 2 tidak berfungsi, anda mungkin perlu menukar lxml/html/__init , alih keluar penggunaan rujukan relatif di dalamnya

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan