PyInstaller не удается правильно упаковать ruamel.yaml

#pyinstaller #ruamel.yaml

#pyinstaller #ruamel.yaml

Вопрос:

Я не могу упаковать ruamel.yaml с использованием PyInstaller.

Я использовал следующий простой тестовый пример:

 from ruamel.yaml import YAML
parser = YAML(typ="safe", pure=True)
print(parser.load("17"))
  

Это работает нормально при обычном запуске, но создает это исключение после упаковки с помощью PyInstaller:

 ImportError: cannot import name 'YAML' from 'ruamel.yaml' (/tmp/_MEIsScRyt/ruamel/yaml/__init__.pyc)
  

Я могу частично обойти эту проблему, сославшись на YAML as ruamel.yaml.main.YAML , но различные свойства упоминаются ruamel.yaml внутри библиотеки, и я не могу их изменить.

Как я могу убедиться, что PyInstaller правильно упаковывает весь ruamel.пакет yaml?

Я использую последнюю версию PyInstaller, установленную через pip3, 4.2.dev0 .

Ответ №1:

Если вы можете ссылаться на ruamel.yaml.main.YAML , но не на ruamel.yaml.YAML , похоже, что pyinstaller неправильно устанавливает ruamel.yaml , __init__.py как это делает:

 from ruamel.yaml.main import *
  

Вы должны проверить, доступен ли этот файл в subdir ruamel/yaml .

В общем, вам следует сравнить файловую иерархию, которую PyInstaller создает / сохраняет, с результатом how `ruamel.yaml должен быть установлен, как указано в документации:

 pip install ruamel.yaml
  

В setup.py пакетах of all и есть некоторые исправления ruamel.* ruamel.*.* для правильной установки этих вложенных пакетов с пространством имен. Однако это только с учетом и протестировано с использованием pip . Установщики, которые не на 100% совместимы с pip , могут делать недопустимые предположения и не устанавливать правильно.