Python produces: OSError: [WinError 193] %1 is not a valid Win32 application, but only with activate_this.py

Python produces: OSError: [WinError 193] %1 is not a valid Win32 application, but only with activate_this.py

这大概与 Python produces: OSError: [WinError 193] %1 is not a valid Win32 application 相同,但是没有答案,我有更多关于我的情况的详细信息。

背景:

我正在使用 venv,它通过 activate_this.py 通过以下方式在内部激活:

exec(compile(open(venv_script, "rb").read(), venv_script, 'exec'), dict(__file__=venv_script))

这至少在 python2 上有效...

当我导入 numpy 时,我得到:

>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Dropbox (CEP)\venvs\win\CYAN\Lib\site-packages\numpy\__init__.py", line 142, in <module>
    from . import core
  File "C:\Dropbox (CEP)\venvs\win\CYAN\Lib\site-packages\numpy\core\__init__.py", line 23, in <module>
    WinDLL(os.path.abspath(filename))
  File "C:\Python37\lib\ctypes\__init__.py", line 356, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application

如果我正常激活 venv,我可以很好地导入 numpy,所以我猜问题出在我如何使用 activate_this.py...

最小案例:

C:\Dropbox (CEP)\venvs>virtualenv testEnv
Using base prefix 'c:\users\brianp\appdata\local\programs\python\python37-32'
New python executable in C:\DROPBO~1\venvs\testEnv\Scripts\python.exe
Installing setuptools, pip, wheel...
done.

C:\Dropbox (CEP)\venvs>testEnv\Scripts\activate

(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)\venvs\testenv\Lib\site-packages\numpy\__init__.py", line 142, in <module>
    from . import core
  File "C:\Dropbox (CEP)\venvs\testenv\Lib\site-packages\numpy\core\__init__.py", line 23, in <module>
    WinDLL(os.path.abspath(filename))
  File "C:\Python37\lib\ctypes\__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>testEnv\Scripts\activate

(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
>>>

这是一个众所周知的错误:这是一个体系结构不匹配(32 位 / 64 位),在您尝试加载 32bit .dll64bit 进程中。为了清楚起见,numpy 包含一堆 .dll,它们在导入时加载到当前进程中。

问题中的示例扭曲且难以阅读:一些示例有效,然后一些无效,然后一些再次有效,依此类推(例如,我什至不知道什么是 2nd 片段目的),而不是明确区分有效的场景和无效的场景。

尽管如此,我还是能够找出问题所在。

  • 您创建(并在其中安装了 numpy)的 testEnv 环境是 32位:

    • 3rd 片段(开始):

      Using base prefix 'c:\users\brianp\appdata\local\programs\python\python37-<strong>32</strong>'

    • 3rd 片段(结束):

      Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 <strong>32 bit</strong> (<strong>Intel</strong>)] on win32

    • 在这种情况下,import numpy 有效(并且 numpy(以及 .dll[=它包含的85=]是32位)
  • 外部启动的Python解释器testEnv64位

    • 3rd 片段(中):

      Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 <strong>64 bit</strong> (<strong>AMD64</strong>)] on win32

    • 当运行testEnvactivate_this.py在当前进程中添加testEnv %PYTHONPATH% (sys.path) 的路径,import numpy 选择 32bit 版本来自 testEnv,显然失败了

要消除此错误,您可以(列出一些可能的选项):

  • 从外部使用 32 位 Python VEnv (C:\Dropbox (CEP)\venvs>python)
  • 反过来:创建一个 testEnv64 VEnv,并使用它的 activate_this.py
  • 根本不要使用activate_this.py,除非你知道自己在做什么(我推荐这个)

可能发生了另一件事。 VS code 从预定义的 OS 位置自动搜索 numpy 和其他包。它可能找到了 numpy32 bit 版本,而不是 64 bit 版本。 使固定: 从所有 OS 个位置卸载 numpy * 在 VS code terminal 中。输入 pip uninstall numpyconda uninstall numpy(如果您使用 Anaconda) * 重启VS代码 *瞧! (如果问题仍然存在,请重新安装 numpy)