Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Saya Mendapat \'OSError: [WinError 193] %1 bukan aplikasi Win32 yang sah\' Apabila Memuatkan DLL dengan ctypes dalam Python?

Mengapa Saya Mendapat \'OSError: [WinError 193] %1 bukan aplikasi Win32 yang sah\' Apabila Memuatkan DLL dengan ctypes dalam Python?

DDD
DDDasal
2024-12-01 13:19:09347semak imbas

Why Am I Getting

Masalah:

Pengguna menghadapi ralat berikut apabila cuba memuatkan DLL menggunakan ctypes dalam Python:

OSError: [WinError 193] %1 is not a valid Win32 application

Ralat ini berlaku apabila cuba menjalankan aplikasi 32-bit pada 64-bit sistem.

Penyelesaian:

Ralat asas ialah ERROR_BAD_EXE_FORMAT (193, 0xC1), yang berlaku apabila Windows cuba memuatkan imej boleh laku (PE) yang sebenarnya tidak . Terdapat pelbagai sebab untuk ralat ini:

  1. Fail tidak lengkap kerana muat turun yang gagal.
  2. Fail telah ditulis ganti atau rosak.
  3. Isu sistem fail merosakkan fail.

Dalam kes tertentu Python memuatkan DLL, ia memanggil LoadLibraryW pada nama DLL, dan ralat yang sama berlaku jika seni bina (32-bit vs 64-bit) DLL tidak sepadan dengan proses Python. Untuk program berjalan dengan betul, seni bina CPU mesti sepadan.

Konteks Python:

CTypes menggunakan LoadLibrary untuk memuatkan DLL, yang boleh membawa kepada ralat yang sama. Berikut ialah contoh:

import ctypes
import os
dll_name = os.path.join(
    os.path.dirname(__file__),
    DLL_BASE_NAME + ("dll" if sys.platform[:3].lower() == "win" else "so"))
print(f"Attempting to load: [{dll_name}]")
dll00 = cts.CDLL(dll_name)

Jika DLL mengandungi kandungan yang tidak sah, ralat akan muncul:

Traceb (most recent call last):
  File "code00.py", line 25, in <module>
    rc = main(*sys.argv[1:])
  File "code00.py", line 14, in main
    dll00 = ct.CDLL(dll_name)
  File "c:\Install\pc064\Python\Python.07.09\lib\ctypes\__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application

Bonus:

DLL juga boleh bergantung pada DLL lain, yang boleh membawa kepada ralat yang sama jika kebergantungan tidak dipenuhi. Ralat ini boleh berlaku secara automatik apabila DLL dipautkan dengan DLL lain semasa penyusunan.

Kesimpulan:

Untuk mengelakkan ralat ini, pastikan:

  • Proses 64-bit hanya memuatkan DLL 64-bit.
  • Proses 32-bit sahaja dimuatkan DLL 32-bit.

Jika ralat berlaku, semak pepohon kebergantungan DLL yang terlibat, kerana ralat mungkin merebak daripada kebergantungan. Selain itu, gunakan alatan untuk menyemak kebergantungan DLL.

Cadangan:

Dalam kes khusus ini, pasang dan jalankan Python 64-bit kerana ia lebih serasi secara meluas .

Atas ialah kandungan terperinci Mengapa Saya Mendapat \'OSError: [WinError 193] %1 bukan aplikasi Win32 yang sah\' Apabila Memuatkan DLL dengan ctypes dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn