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.
Buka manifes python.exe dan cari kebergantungan <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
Buka manifes etree.pyd dan ketahui bahawa tiada maklumat yang bergantung pada CRT.
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:
Daripada menggunakan VS2013, gunakan VS2008 untuk menyusun exe Manifes dalam versi Keluaran yang disusun mempunyai maklumat pergantungan CRT, yang tidak berbeza daripada python.exe.
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
Tiada maklumat pergantungan CRT dalam manifes VS2013 Bagaimanakah ia menyelesaikan masalah konflik CRT berbilang versi? Atau adakah VS2013 menulis maklumat ini ke lokasi lain?
Adakah DLL tanpa maklumat pergantungan CRT benar-benar menggunakan maklumat pergantungan CRT dalam program utama seperti yang diduga?
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
Penyelesaian ditemui:
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.Buka manifes python.exe dan cari kebergantungan
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
Buka manifes etree.pyd dan ketahui bahawa tiada maklumat yang bergantung pada CRT.
Exe saya ditulis dalam VS2013. Apabila saya membuka manifes, saya juga mendapati tiada maklumat yang bergantung pada CRT.
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.
Terdapat dua cara untuk menyelesaikan masalah ini:
Daripada menggunakan VS2013, gunakan VS2008 untuk menyusun exe Manifes dalam versi Keluaran yang disusun mempunyai maklumat pergantungan CRT, yang tidak berbeza daripada python.exe.
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!
Tiada maklumat pergantungan CRT dalam manifes VS2013 Bagaimanakah ia menyelesaikan masalah konflik CRT berbilang versi? Atau adakah VS2013 menulis maklumat ini ke lokasi lain?
Adakah DLL tanpa maklumat pergantungan CRT benar-benar menggunakan maklumat pergantungan CRT dalam program utama seperti yang diduga?
Panggil dahulu
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