Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bad path leads to: ImportError: DLL load failed: %1 is not a valid Win32 application. #69771

Open
lac mannequin opened this issue Nov 8, 2015 · 11 comments
Open

Bad path leads to: ImportError: DLL load failed: %1 is not a valid Win32 application. #69771

lac mannequin opened this issue Nov 8, 2015 · 11 comments
Labels
3.9 only security fixes 3.10 only security fixes extension-modules C modules in the Modules dir OS-windows type-bug An unexpected behavior, bug, or error

Comments

@lac
Copy link
Mannequin

lac mannequin commented Nov 8, 2015

BPO 25585
Nosy @pfmoore, @tjguk, @bitdancer, @zware, @eryksun, @zooba

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2015-11-08.17:36:01.272>
labels = ['extension-modules', '3.10', 'type-bug', '3.9', 'OS-windows']
title = 'Bad path leads to: ImportError: DLL load failed: %1 is not a valid Win32 application.'
updated_at = <Date 2021-03-08.20:11:27.261>
user = 'https://bugs.python.org/lac'

bugs.python.org fields:

activity = <Date 2021-03-08.20:11:27.261>
actor = 'vstinner'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Extension Modules', 'Windows']
creation = <Date 2015-11-08.17:36:01.272>
creator = 'lac'
dependencies = []
files = []
hgrepos = []
issue_num = 25585
keywords = []
message_count = 11.0
messages = ['254349', '254353', '254368', '254392', '254394', '254395', '254410', '254430', '254431', '261352', '387655']
nosy_count = 7.0
nosy_names = ['paul.moore', 'tim.golden', 'r.david.murray', 'zach.ware', 'eryksun', 'steve.dower', 'lac']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = 'behavior'
url = 'https://bugs.python.org/issue25585'
versions = ['Python 3.9', 'Python 3.10']

@lac
Copy link
Mannequin Author

lac mannequin commented Nov 8, 2015

Somebody reported this today:

File "C:/Python27/kivyhello.py", line 4, in <module>
from kivy.app import App
File "C:/Python27\kivy\app.py", line 316, in <module>
from kivy.base import runTouchApp, stopTouchApp
File "C:/Python27\kivy\base.py", line 30, in <module>
from kivy.event import EventDispatcher
File "C:/Python27\kivy\event.py", line 8, in <module>
import kivy._event
ImportError: DLL load failed: %1 is not a valid Win32 application.

----------------

The problem was that they needed to set their PATH properly so kivy could be found.

Couldn't we generate a more informative error message here?
Is the %1 even correct?

@SilentGhost SilentGhost mannequin added the OS-windows label Nov 8, 2015
@bitdancer
Copy link
Member

I'm guessing that's the error we got from the OS. Maybe there's additional info we could add, though, I don't know. It would be interesting to know if it does the same thing in python3...and unfortunately it isn't as easy to change things in the python2 import system as it is in python3.

@eryksun
Copy link
Contributor

eryksun commented Nov 9, 2015

The "DLL load failed" message is from Python, but the rest is the text for the Windows error code, ERROR_BAD_EXE_FORMAT (0x00c1) 1. The "%1" in the string can be expanded as the first element of the Arguments array parameter of FormatMessage 2. But currently the code in Python/dynload_win.c uses FORMAT_MESSAGE_IGNORE_INSERTS and does no post-processing to replace the "%1".

I don't know why the Windows loader reported ERROR_BAD_EXE_FORMAT instead of ERROR_MOD_NOT_FOUND. Possibly it found another version of a dependent DLL that was corrupt or for a different architecture.

Note that the setup in this case is odd in that the package is installed in C:\Python27 instead of in the site-packages directory.

@bitdancer
Copy link
Member

OK, so it sounds like there are improvements we could make here if someone wants to work on it.

@vstinner
Copy link
Member

vstinner commented Nov 9, 2015

Does Windows provide a function to format a string using %1, %2, etc.?

Note: Python 3.6 uses the same code than Python 2.7.

@zooba
Copy link
Member

zooba commented Nov 9, 2015

It does, but you need to identify the error code precisely and use that to provide the parameters when obtaining the message. It's more about localization than a general way of obtaining error text. Better off just using our own message in this case (which is probably a breaking change for 2.7...)

@eryksun
Copy link
Contributor

eryksun commented Nov 9, 2015

Steve, do you think it's OK to abandon localization for exception messages? If so, should we be using English for all FormatMessage calls? It's a bit ugly that Python's exceptions and the CRT error messages are in English, but then whenever we call FormatMessage with LANG_NEUTRAL/SUBLANG_DEFAULT we're getting localized error text. For example, the import error in the following case has a mix or Russian and English:

    import io, sys, ctypes
    kernel32 = ctypes.WinDLL('kernel32')

    MUI_LANGUAGE_NAME = 8
    kernel32.SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, u'ru-RU\0', None)
    kernel32.SetConsoleOutputCP(1251)
    sys.stderr = io.TextIOWrapper(open(r'\\.\con', 'wb'), encoding='1251')
    open('blah.pyd', 'w').close()
    >>> import blah
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: DLL load failed: %1 не является приложением Win32.

@zooba
Copy link
Member

zooba commented Nov 10, 2015

For 3.6 I think it's fine, but people are almost certainly relying on the current message on their system and changing it at all for any existing release is unnecessary pain (3.5.1 *might* be okay, but only because it's so recent).

It would be nice to invest in some better diagnostics here, though with the ABI tag in 3.5 you're now unlikely to get an incompatible binary. File not found will be the most common message.

@zooba
Copy link
Member

zooba commented Nov 10, 2015

Correction, *import* not found, and the only way to resolve it is to do a second scan of sys.path for the sole purpose of diagnostics. Probably more harmful than helpful.

@vstinner
Copy link
Member

vstinner commented Mar 8, 2016

See also issue bpo-26493.

@eryksun
Copy link
Contributor

eryksun commented Feb 25, 2021

In 3.8+, the DLL search path for dependent DLLs when importing extension modules excludes PATH and the current working directory. So it's far less likely for an import to fail with ERROR_BAD_EXE_FORMAT.

Currently the error message in Python 3 includes the base name of the extension module, e.g. "DLL load failed while importing _spam". No error codes are special cased to use custom error messages, so it still includes the localized error text from the system, which may contain parameterized inserts (%).

The common errors when importing an extension module are missing and mismatched dependent DLLs: ERROR_MOD_NOT_FOUND (126) and ERROR_PROC_NOT_FOUND (127). The system messages for these two errors do not contain inserts. For example, if the UI language is Japanese, a missing DLL dependency raises the following exception:

ImportError: DLL load failed while importing _spam: 指定されたモジュールが見つかりません。

@eryksun eryksun added extension-modules C modules in the Modules dir 3.9 only security fixes 3.10 only security fixes type-bug An unexpected behavior, bug, or error labels Feb 25, 2021
@ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.9 only security fixes 3.10 only security fixes extension-modules C modules in the Modules dir OS-windows type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

4 participants