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

Python生成:OSError:[WinError 193]%1不是有效的Win32应用程序,但仅使用activate_this.py,python,virtualenv,Python,Virtualenv,这大概是相同的,但是,没有答案,我有更多的细节,我的情况 背景: 我使用的是venv,它通过以下方式在内部激活:activate\u this.py: exec(compile(open(venv_script, "rb").read(), venv_script, 'exec'), dict(__file__=venv_script)) 这至少对python2有效 当我导入numpy时,我得到: >>> import numpy Traceback (most recent

这大概是相同的,但是,没有答案,我有更多的细节,我的情况

背景:

我使用的是venv,它通过以下方式在内部激活:
activate\u 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

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

这个问题中的例子是扭曲的,很难理解:一些例子有效,一些不起作用,然后一些再次起作用,等等(例如,我甚至不知道第二个片段的目的是什么),而不是清楚地区分起作用的场景和不起作用的场景

无论如何,尽管有上述情况,我还是能够确定问题所在

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

    • 第三段(开始):

      使用基本前缀“c:\users\brianp\appdata\local\programs\python 37-32

    • 第三段(结束):

      python3.7.2(tags/v3.7.2:9A3ffc0492018年12月23日22:20:52)[MSC v.191632位Intel)]

    • 在这种情况下,
      import numpy
      起作用(并且numpy(它包含的.dll)是32位的
  • 外部testEnv启动的Python解释器是64位

    • 第三段(mid):
      python3.7.3(v3.7.3:ef4ec6ed12,2019年3月25日,22:22:05)[MSC v.191664位AMD64)]在win32上

    • 在当前进程中运行testEnv的activate_this.py时,它会将testEnv路径添加到%PYTHONPATH%(
      sys.path
      ),并且
      import numpy
      会从testEnv中选取32位版本,这显然会失败
要消除此错误,您可以(列出一些可能的选项):

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

    • 可能发生了另一件事
      VS code
      自动从预定义的操作系统位置搜索numpy和其他软件包。它可能找到了
      32位
      版本的
      numpy
      ,而不是
      64位的
      版本。
      修正:
      从所有操作系统位置卸载
      numpy
      *在
      VS代码终端中
      。键入
      pip uninstall numpy
      conda uninstall numpy
      (如果使用
      Anaconda
      ) *重新启动VS代码
      *瞧!(如果问题仍然存在,请重新安装numpy)

      如果在错误之前提供一个.Add a
      print(sys.executable)
      ,并粘贴output@CristiFati: Done@UlrichEckhardt什么能使它完整?它非常小。。。我打开python,在大块中键入内容,然后得到错误…“NameError:name'venv_script'未定义”-请阅读提供的链接。人们不应该猜测其他部分看起来像什么或者猜测哪些部分是相关的。最好从设置venv的空目录开始。当然,只要设置一个venv是必要的,这是你在这里发布之前要做的工作。。。我不想在添加更多信息时删除代码段,所以我只添加了一个新的代码段。。。抱歉,如果这让人困惑的话。。。B-/不必道歉,因为它更难阅读,它让我更加注意:)。底线:我的解释有意义吗?是的!这让我克服了那个问题,进入了下一个问题!
      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
      >>>