Python产生:OSError:[WinError 193]%1不是有效的Win32应用程序,仅带有activate_this.py

时间:2019-04-17 17:18:58

标签: python virtualenv

这大概与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 fine,所以我猜问题出在我如何使用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
>>>

2 个答案:

答案 0 :(得分:1)

这是一个众所周知的错误:这是架构不匹配( 32bit / 64bit ),在您的情况下,尝试加载 32bit < em> .dll 在 64bit 进程中。为了清楚起见, numpy 包含一堆 .dll ,这些文件在导入时会在当前进程中加载​​。

问题中的示例是扭曲且难以阅读的:一些有效的示例,然后一些不起作用,然后又重新起作用,依此类推(例如,我什至不知道2是什么) 代码段的目的),而不是将有效的方案与无效的方案明确分开。

尽管如此,我仍然能够找出问题所在。

  • 您创建(并安装了 numpy )的 testEnv 环境为 32bit :< / p>

    • 3 rd 片段(开始):

        

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

    • 3 rd 片段(结束):

        

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

    • 在这种情况下,import numpy有效(并且 numpy (及其包含的 .dll s))为 32bit
  • 外部启动的 Python 解释器为 64bit

    • 3 rd 片段(中):
        

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

    • 在当前进程中运行 testEnv activate_this.py 时,会将 testEnv 路径添加到%PYTHONPATH%sys.path)和import numpy testEnv 中选择 32bit 版本,显然失败了

要摆脱此错误,您可以选择(列出一些可能的选项):

  • VEnv C:\Dropbox (CEP)\venvs>python)外部使用 32位 Python
  • 另一种方法:创建一个 testEnv64 VEnv ,并使用其 activate_this.py
  • 完全不要使用 activate_this.py ,除非您知道自己在做什么(我建议您这样做)

答案 1 :(得分:0)

可能发生了另一件事。 VS code从预定义的操作系统位置自动搜索numpy和其他软件包。它可能发现了32 bit的{​​{1}}版本而不是numpy版本。 固定: 从所有操作系统位置卸载64 bit *在numpy中。输入VS code terminalpip uninstall numpy(如果使用conda uninstall numpy) *重新启动VS代码 *瞧! (如果问题仍然存在,请重新安装numpy)