Maison > développement back-end > Tutoriel Python > Pourquoi est-ce que j'obtiens « OSError : [WinError 193] %1 n'est pas une application Win32 valide » lors du chargement de DLL avec des ctypes en Python ?

Pourquoi est-ce que j'obtiens « OSError : [WinError 193] %1 n'est pas une application Win32 valide » lors du chargement de DLL avec des ctypes en Python ?

DDD
Libérer: 2024-12-01 13:19:09
original
429 Les gens l'ont consulté

Why Am I Getting

Problème :

Les utilisateurs rencontrent l'erreur suivante lorsqu'ils tentent de charger une DLL à l'aide de ctypes en Python :

OSError: [WinError 193] %1 is not a valid Win32 application
Copier après la connexion

Cette erreur se produit lorsque vous essayez d'exécuter une application 32 bits sur un ordinateur 64 bits. système.

Solution :

L'erreur sous-jacente est ERROR_BAD_EXE_FORMAT (193, 0xC1), qui se produit lorsque Windows tente de charger une image exécutable (PE) qui n'est en réalité pas . Il existe plusieurs raisons à cette erreur :

  1. Le fichier est incomplet en raison d'un échec de téléchargement.
  2. Le fichier a été écrasé ou corrompu.
  3. Des problèmes de système de fichiers ont corrompu le fichier.

Dans le cas spécifique où Python charge une DLL, il appelle LoadLibraryW sur le nom de la DLL, et le la même erreur se produit si l'architecture (32 bits vs 64 bits) de la DLL ne correspond pas à celle du processus Python. Pour que les programmes fonctionnent correctement, les architectures de processeur doivent correspondre.

Contexte Python :

CTypes utilise LoadLibrary pour charger les DLL, ce qui peut conduire à la même erreur. Voici un exemple :

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)
Copier après la connexion

Si la DLL contient du contenu invalide, l'erreur apparaîtra :

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
Copier après la connexion

Bonus :

DLL peut également dépendre d'autres DLL, ce qui peut conduire à la même erreur si les dépendances ne sont pas respectées. Cette erreur peut se produire automatiquement lorsqu'une DLL est liée à une autre DLL lors de la compilation.

Conclusion :

Pour éviter cette erreur, assurez-vous que :

  • Les processus 64 bits chargent uniquement les DLL 64 bits.
  • Les processus 32 bits chargent uniquement les DLL 32 bits. DLL.

Si l'erreur se produit, vérifiez l'arborescence des dépendances des DLL impliquées, car l'erreur peut se propager à partir des dépendances. De plus, utilisez des outils pour vérifier les dépendances des DLL.

Recommandation :

Dans ce cas précis, installez et exécutez Python 64 bits car il est plus largement compatible .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal