Python生成:OSError:[WinError 193]%1不是有效的Win32应用程序,但只能使用activate_这个.py

2024-04-24 03:29:39 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能与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))

这至少对Python有效。。。在

当我导入numpy时,我得到:

^{pr2}$

如果我正常激活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
>>>

Tags: inpynumpyvenvvenvspackageslinescripts
2条回答

可能发生了另一件事。VS code自动从预定义的操作系统位置搜索numpy和其他包。它可能发现了32 bitnumpy版本,而不是64 bit版本。 修复: {3>从所有位置卸载} *在VS code terminal中。键入pip uninstall numpyconda uninstall numpy(如果使用Anaconda) *重新启动VS代码 *喂!(如果问题仍然存在,请重新安装numpy)

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

这个问题中的例子是扭曲的,很难阅读:有些是有效的,有些是不起作用的,然后是一些再次起作用的例子,等等(例如,我甚至不知道2nd片段的目的是什么),而不是清楚地将有用的场景与不起作用的场景分开

不管怎么说,尽管有上述情况,我还是能够找出问题所在。在

  • 您创建(并安装numpytestEnv环境是32bit

    • 3rd片段(开始):

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

    • 3rd片段(结束):

      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(以及它包含的.dll32位
  • 外部启动的Python解释器是64位

    • 3rd代码段(mid):

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

    • 运行测试时激活_这个.py在当前进程中,它将testEnv路径添加到%PYTHONPATH%sys.path),并且import numpytestEnv中选择32位版本,这显然失败了

您可以删除其中一个选项:

  • 从外部使用32bitPythonC:\Dropbox (CEP)\venvs>python
  • 另一种方法:创建一个测试nv64VEnv,并使用它的激活_这个.py
  • 不要使用激活_这个.py除非你知道你在做什么(我推荐这个)

相关问题 更多 >