PyWin32 и Python 3.8.0 - PullRequest
       80

PyWin32 и Python 3.8.0

1 голос
/ 30 октября 2019

Python 3.8.0 был недавно выпущен ( 20191014 и может быть загружен с [Python]: Python 3.8.0 ).
PyWin32 имеет сборки для него на [PyPI]: pywin32 225 (выпущено 20190915 ). К сожалению, после pip install ing он не работает.

Пример:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q058631512]> sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe"
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.
>>> import win32api
>>> ^Z


[prompt]> "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\Scripts\python.exe"
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32api
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing win32api: The specified module could not be found.
>>> ^Z

Примечания :

  • Для Python 3.7 я также обновил свой модуль PyWin32 до последней версии, и он работает
  • Старые PyWin32 версии работают наболее старые Python версии ( 2,7 , 3,5 , 3,6 )
  • Воспроизводимые на 64bit и 32 бит

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Обновление 0 :

[PyPI]: pywin32 227 (который решает эту проблему), опубликовано в 20191114!



Оповещение о спойлере !!!

Применено # 2.2. (снизу) к исходным .whl s и опубликовал их в [GitHub]: CristiFati / Prebuilt-Binaries - (master) Prebuilt-Binaries / PyWin32 / v225 ( win_amd64 , win32 для Python 3.8 ).

После установки (одного из них) существующий код должен работать OOTB (относительно этой проблемы).


О проблеме сообщили на [GitHub]: mhammond / pywin32 - python 3.8 .

Приведенный выше URL ссылается еще на 2:

  • [Python 3.8.Docs]: что нового в Python 3.8 - Изменения в Python API , который гласит ( упор - мой):
    • Зависимости DLL для модулей расширения и библиотеки DLL, загруженные ctypes в Windows, теперь разрешаются более безопасно. Только системные пути, каталог, содержащий файл DLL или PYD, и каталоги, добавленные с помощью add_dll_directory () , ищутся для зависимостей времени загрузки. В частности, PATH и текущий рабочий каталог больше не используются, и их модификации больше не будут влиять на нормальное разрешение DLL.
  • [Python 3.Docs]: os. add_dll_directory ( path ) , в котором говорится ( выделение все еще мое):

    Этот путь поиска используется при разрешении зависимостей для импортированных модулей расширения (сам модуль разрешается с помощью sys.path), а также ctypes .

В то же время я немного покопался и обнаружил, что (для win32api.pyd ) это pywintypes38.dll (что является зависимостью для .pyd s), который не найден (я также указал это в комментарии к проблеме).

Решения (на самом деле обходные пути (более или менее) довыпущено официальное и обратно совместимое исправление):

  1. Force pywintypes38.dll load byимпортировать его (так как это также модуль Python и в этом сценарии он не подпадает под указанное выше правило) до любого PyWin32 модуля:

    import pywintypes
    import win32api
    

    При работе с COM вам понадобится import pythoncom

  2. Добавление pywin32_system32 в .dll путей поиска (по новой модели сверху). Есть несколько способов:

    1. v-python комментарий к проблеме URL , который предоставляет небольшой фрагмент (я не проверял его)
    2. Я также отправил [GitHub]: mhammond / pywin32 - Поддержка Python 3.8 , где я делаю все в pywin32.pth file («выполняется» при запуске интерпретатора, поэтому никаких изменений для существующего кода не требуется). К сожалению, существует проблема с автоматизированными тестами AppVeyor , которые не проходят (но по некоторым другим причинам), поэтому он застрял там на некоторое время. Обратите внимание, что в то же время, PR был закрыт, и был применен другой (аналогичный) подход. Обратите внимание, что v226 (выпущенный 20191110 ), содержащий исправление, не работает на VirtualEnv ( [SO]: PyWin32 (226) и виртуальные среды (ответ @ CristiFati) ).
      В любом случае, применяя изменения локально (1) (на обоих моих Python VirtualEnv s), решил проблему (с одной и не сломал другую):

      [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q058631512]> sopr.bat
      *** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***
      
      [prompt]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" -c "import win32api"
      
      [prompt]> "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\Scripts\python.exe" -c "import win32api"
      
      [prompt]>
      
    3. Другие способы, такие как копирование .dll s (например, % SystemRoot% \ System32 ) или символическая ссылка , но (лично) я бы не рекомендовал эти



Примечание # 1

Проверка [SO]: запуск / отладка UnitTests приложения Djangoщелкнуть правой кнопкой мыши контекстное меню в PyCharm Community Edition? (@ Ответ CristiFati) ( Patching utrunner section) о том, как применять патчи (на Win ).

1 голос
/ 01 ноября 2019

удалось установить pywin32 v225 с pycharm на python 3.8.

, импортировать pywintypes до win32api

import pywintypes
import win32api
...