Python создает: OSError: [WinError 193]% 1 не является допустимым приложением Win32, но только с activ_this.py - PullRequest
0 голосов
/ 17 апреля 2019

Предположительно, это то же самое, что и Python создает: OSError: [WinError 193]% 1 не является допустимым приложением Win32 Однако, у него нет ответов, и у меня есть дополнительные сведения для моей ситуации.

Справочная информация:

Я использую 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
>>>

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Это хорошо известная ошибка: это несоответствие архитектуры ( 32 бита / 64 бита ), в вашем случае при попытке загрузить 32 бита .DLL в процессе 64 бит .Чтобы прояснить ситуацию, numpy содержит набор .dll s, которые загружаются в текущем процессе при его импорте.

Примеры в вопросе скручены итрудно читаемый: какой-то пример, который работает, потом другой, который не работает, другой, который работает снова и так далее (например, я даже не знаю, какова цель фрагмента 2 nd ) вместо четкого разделенияСценарии, которые работают из тех, которые не работают.

В любом случае, несмотря на вышеизложенное, я смог определить проблему.

  • testEnv среда, которую вы создали (и установили numpy in): 32bit :

    • 3 rd фрагмент (начало):

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

    • 3 rd фрагмент (конец):

      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 s, которые он содержит) равен 32bit )
  • Интерпретатор Python , запущенный с снаружи testEnv , равен 64bit

    • 3 rd фрагмент (средний):

      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 activ_this.py в текущем процессе он добавляет testEnv путей к % PYTHONPATH% (sys.path) и import numpy выбирает 32-битную версию из testEnv , которая явно не работает

Чтобы избавиться от этой ошибкиВы можете либо (перечисляя некоторые из возможных вариантов):

  • Использовать 32-бит Python извне VEnv (C:\Dropbox (CEP)\venvs>python)
  • Другой способ: создать testEnv64 VEnv и использовать его activ_this.py
  • Неиспользуйте activ_this.py вообще, если только вы не знаете, что делаете (я бы порекомендовал это)
0 голосов
/ 25 июля 2019

Может случиться и другое. VS code автоматически ищет numy и другие пакеты из предопределенных расположений ОС. Возможно, он обнаружил 32 bit версию numpy вместо 64 bit версии. Fix: Удалите numpy из всех мест ОС * В VS code terminal. Введите pip uninstall numpy или conda uninstall numpy (если вы используете Anaconda) * Перезапустите VS код * Вуаля! (Переустановите NumPy, если проблема не устранена)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...