Home >Backend Development >Python Tutorial >Why Am I Getting \'OSError: [WinError 193] %1 is not a valid Win32 application\' When Loading DLLs with ctypes in Python?

Why Am I Getting \'OSError: [WinError 193] %1 is not a valid Win32 application\' When Loading DLLs with ctypes in Python?

DDD
DDDOriginal
2024-12-01 13:19:09335browse

Why Am I Getting

Problem:

Users encounter the following error when trying to load a DLL using ctypes in Python:

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

This error occurs when trying to run a 32-bit application on a 64-bit system.

Solution:

The underlying error is ERROR_BAD_EXE_FORMAT (193, 0xC1), which occurs when Windows tries to load an executable (PE) image that is actually not. There are various reasons for this error:

  1. The file is incomplete due to a failed download.
  2. The file was overwritten or corrupted.
  3. Filesystem issues corrupted the file.

In the specific case of Python loading a DLL, it calls LoadLibraryW on the DLL name, and the same error occurs if the architecture (32-bit vs 64-bit) of the DLL does not match that of the Python process. For programs to run correctly, the CPU architectures must match.

Python Context:

CTypes uses LoadLibrary to load DLLs, which can lead to the same error. Here is an example:

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)

If the DLL contains invalid content, the error will appear:

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:

DLLs can also depend on other DLLs, which can lead to the same error if the dependencies are not met. This error can occur automatically when a DLL is linked against another DLL during compilation.

Conclusion:

To avoid this error, ensure that:

  • 64-bit processes only load 64-bit DLLs.
  • 32-bit processes only load 32-bit DLLs.

If the error occurs, check the dependency tree of the DLLs involved, as the error may propagate from dependencies. Additionally, use tools to check the dependencies of the DLLs.

Recommendation:

In this specific case, install and run 64-bit Python since it is more widely compatible.

The above is the detailed content of Why Am I Getting \'OSError: [WinError 193] %1 is not a valid Win32 application\' When Loading DLLs with ctypes in Python?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn