Почему встраиваемый дистрибутив Python не может найти собственные модули? - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать автономный дистрибутив WeasyPrint для Windows. Я скачал и распаковал встраиваемый ZIP-файл Python 3.8 в каталог dist. Затем в MSYS2 я использовал полный интерпретатор Python 3.8 с Pip для установки WeasyPrint в каталог dist (учитывая ошибку в Pillow при установке на MSYS2):

pip install --target dist --global-option=build_ext --global-option="-ldl" pillow
pip install --target dist weasyprint

Теперь, когда Я запускаю WeasyPrint:

./dist/python.exe -m weasyprint http://weasyprint.org test.pdf

Я получаю:

Traceback (most recent call last):
  File "runpy.py", line 184, in _run_module_as_main
  File "runpy.py", line 143, in _get_module_details
  File "runpy.py", line 110, in _get_module_details
  File "C:\msys64\home\David\dist\weasyprint\__init__.py", line 440, in <module>
    from .css import preprocess_stylesheet  # noqa isort:skip
  File "C:\msys64\home\David\dist\weasyprint\css\__init__.py", line 30, in <module>
    from . import computed_values, media_queries
  File "C:\msys64\home\David\dist\weasyprint\css\computed_values.py", line 18, in <module>
    from .. import text
  File "C:\msys64\home\David\dist\weasyprint\text.py", line 14, in <module>
    import cairocffi as cairo
  File "C:\msys64\home\David\dist\cairocffi\__init__.py", line 17, in <module>
    from ._generated.ffi import ffi
  File "C:\msys64\home\David\dist\cairocffi\_generated\ffi.py", line 2, in <module>
    import _cffi_backend
ModuleNotFoundError: No module named '_cffi_backend'

Как Python может найти другие модули, но не собственный? В каталоге dist есть файл с именем _cffi_backend-cpython-38.dll. Это все еще не работает, если я переименую файл в _cffi_backend.dll.

1 Ответ

0 голосов
/ 08 марта 2020

Как Smankusors упомянул в комментарии, это вызвано MSYS2 Python и встраиваемым Python, использующим различные суффиксы для модулей расширения:

Embeddable Python:

$ ./dist/python.exe -c 'from importlib.machinery import EXTENSION_SUFFIXES; print(EXTENSION_SUFFIXES)'
['.cp38-win_amd64.pyd', '.pyd']

MSYS2 Python:

$ python -c 'from importlib.machinery import EXTENSION_SUFFIXES; print(EXTENSION_SUFFIXES)'
['-cpython-38.dll', '-abi3.dll', '.cp38.pyd', '.pyd']

Поэтому, когда колесо CFFI построено с MSYS2 Python, используется суффикс MSYS2 Python, но Embeddable Python не знает, как его искать , Исправление состоит в том, чтобы переименовать библиотеки DLL, чтобы использовать один из суффиксов Embeddable Python или использовать собственную Windows установку Python для установки модулей.

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