This is presumably the same as Python produces: OSError: [WinError 193] %1 is not a valid Win32 application However, that has no answers, and I have additional details for my situation.
Background:
I’m using a venv, it gets activated internally with activate_this.py
via:
exec(compile(open(venv_script, "rb").read(), venv_script, 'exec'), dict(__file__=venv_script))
This worked on python2 at least…
when I import numpy I get:
>>> import numpy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:Dropbox (CEP)venvswinCYANLibsite-packagesnumpy__init__.py", line 142, in <module>
from . import core
File "C:Dropbox (CEP)venvswinCYANLibsite-packagesnumpycore__init__.py", line 23, in <module>
WinDLL(os.path.abspath(filename))
File "C:Python37libctypes__init__.py", line 356, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application
If I activate the venv normally, I can import numpy fine, so I’m guessing the problem is how I’m using activate_this.py
…
Minimal case:
C:Dropbox (CEP)venvs>virtualenv testEnv
Using base prefix 'c:\users\brianp\appdata\local\programs\python\python37-32'
New python executable in C:DROPBO~1venvstestEnvScriptspython.exe
Installing setuptools, pip, wheel
done.
C:Dropbox (CEP)venvs>testEnvScriptsactivate
(testEnv) C:Dropbox (CEP)venvs>pip install numpy
Collecting numpy
Using cached https://files.pythonhosted.org/packages/61/be/b4d697563d4a211596a350414a87612204a8bb987c4c1b34598cd4904f55/numpy-1.16.2-cp37-cp37m-win32.whl
Installing collected packages: numpy
Successfully installed numpy-1.16.2
(testEnv) C:Dropbox (CEP)venvs>deactivate
C:Dropbox (CEP)venvs>python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> this_file = 'testenv/Scripts/activate_this.py'
>>> exec(open(this_file).read(), {'__file__': this_file})
>>> import numpy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:Dropbox (CEP)venvstestenvLibsite-packagesnumpy__init__.py", line 142, in <module>
from . import core
File "C:Dropbox (CEP)venvstestenvLibsite-packagesnumpycore__init__.py", line 23, in <module>
WinDLL(os.path.abspath(filename))
File "C:Python37libctypes__init__.py", line 356, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application
>>> exit()
C:Dropbox (CEP)venvs>testEnvScriptsactivate
(testEnv) C:Dropbox (CEP)venvs>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>>
Advertisement
Answer
This is a well known error: it’s an architecture mismatch 032bit / 064bit (pc032 / pc064), in your case trying to load a 032bit .dll in a 064bit process. To make things clear, NumPy contains a bunch of .dlls that get loaded in the current process when importing it.
It’s actually a duplicate of [SO]: Python Ctypes – loading dll throws OSError: [WinError 193] %1 is not a valid Win32 application (@CristiFati’s answer), but I’m going to detail.
The examples in the question are twisted and hard to read: some example that works, then some that doesn’t then some that works again and so on (for example I don’t even know what’s the 2nd snippet purpose), instead of clearly separating scenarios that do work from those that don’t.
Anyway in spite of the above, I was able to identify the problem.
The testEnv environment that you created (and installed NumPy in) is pc032:
3rd snippet (begin):
JavaScript131Using base prefix
2'c:\users\brianp\appdata\local\programs\python\python37-32'
3
3rd snippet (end):
JavaScript121Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)] on win32
2
In this case,
import numpy
works (and NumPy (and the .dlls that it contains) is pc032)
The Python interpreter launched from outside testEnv is pc064:
3rd snippet (mid):
JavaScript121Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
2
When running testEnv‘s activate_this.py in the current process, it adds testEnv paths to %PYTHONPATH% (sys.path), and
import numpy
picks the pc032 version from testEnv, which obviously fails
To get rid of this error you can either (listing some of the possible options):
Use a pc032 Python from outside VEnv (C:Dropbox (CEP)venvspython)
The other way around: create a testEnv64 VEnv, and use its activate_this.py
Don’t use activate_this.py at all, unless you know what you’re doing (I’d recommend this one)
Might also want to check [SO]: PyCharm doesn’t recognize installed module (@CristiFati’s answer).