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 .dll 在 64bit 进程中。为了清楚起见,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解释器testEnv是64位
- 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
- 当运行testEnv的activate_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 和其他包。它可能找到了 numpy
的 32 bit
版本,而不是 64 bit
版本。
使固定:
从所有 OS 个位置卸载 numpy
* 在 VS code terminal
中。输入 pip uninstall numpy
或 conda uninstall numpy
(如果您使用 Anaconda
)
* 重启VS代码
*瞧! (如果问题仍然存在,请重新安装 numpy)
这大概与 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 .dll 在 64bit 进程中。为了清楚起见,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解释器testEnv是64位
- 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
- 当运行testEnv的activate_this.py在当前进程中添加testEnv %PYTHONPATH% (
sys.path
) 的路径,import numpy
选择 32bit 版本来自 testEnv,显然失败了
- 3rd 片段(中):
要消除此错误,您可以(列出一些可能的选项):
- 从外部使用 32 位 Python VEnv (
C:\Dropbox (CEP)\venvs>python
) - 反过来:创建一个 testEnv64 VEnv,并使用它的 activate_this.py
- 根本不要使用activate_this.py,除非你知道自己在做什么(我推荐这个)
可能发生了另一件事。 VS code
从预定义的 OS 位置自动搜索 numpy 和其他包。它可能找到了 numpy
的 32 bit
版本,而不是 64 bit
版本。
使固定:
从所有 OS 个位置卸载 numpy
* 在 VS code terminal
中。输入 pip uninstall numpy
或 conda uninstall numpy
(如果您使用 Anaconda
)
* 重启VS代码
*瞧! (如果问题仍然存在,请重新安装 numpy)