Импорт локальных модулей, на которые есть точечные ссылки с помощью PyInstaller

#python #python-3.x #pyinstaller

#python #python-3.x #pyinstaller

Вопрос:

У меня есть скрипт на python, над которым я работаю, который я упаковываю в один исполняемый файл с помощью pyinstaller.

В скрипте, когда он не скомпилирован, я ссылаюсь на набор инструментов, которые находятся в папке рядом с основным скриптом, так что что-то вроде этого:

 parent
    ----->tools
       ------>db.py
       ------>file_utils.py
main.py
  

Я опустил инициализацию, но она тоже есть. В моем скрипте я импортирую эти файлы следующим образом

 import tools.db
import tools.file_utils
  

и все это отлично работает. Когда я упаковываю его как исполняемый файл с помощью PyInstaller, я получаю ошибку module not found для tools. Я пытался добавить абсолютный путь к инструментам, добавить инструменты и соответствующие файлы в скрытый импорт и все такое, но у меня такое чувство, что это способ, которым я вызываю их в скрипте.

Я полагаю, что все эти вспомогательные скрипты могли бы просто находиться в родительском каталоге рядом со скриптом, или я мог бы добавить инструменты в sys.path и просто импортировать db и fileutils напрямую, но это кажется немного неряшливым и / или загроможденным. Чего-нибудь очевидного мне не хватает?

Ответ №1:

Итак, после выравнивания всей моей структуры каталогов в папке tmp для записи исполняемого файла и изменения моего файла спецификации, чтобы он не компилировался в другой каталог (а также добавления родительского каталога к переключателю -p) и не забыв удалить ссылку в другом файле py на другой модуль, который больше не существует, у меня все это заработало.

Я думаю, что я восстановлю части, чтобы в будущем мне было намного проще выполнять эту работу, и попытаюсь определить, какая часть процесса приводила к ошибкам импорта моей упаковки, но это было полезное упражнение, позволяющее немного разобрать части PyInstaller и узнать больше о перехватах и импорте, а также об импорте на уровне модуля / пакета.

Комментарии:

1. Это было опубликовано в 2015 году, поскольку сейчас 2019 год, вы нашли какое-либо новое решение для этого?

2. 15 марта в данном случае было 15 марта 2019 года. В конечном счете, я закончил созданием нового каталога проекта, созданием venv и вызовом pyinstaller оттуда. Я думаю, что, должно быть, было что-то кэшированное, что запрещало мне использовать pyinstaller. Инструкции import, которые я пометил как принятый ответ, сработали. Однако я не помню всех особенностей проблемы и решения.

Ответ №2:

Попробуйте:

 from tools import db
from tools import file_utils
  

Комментарии:

1. Итак, это то, что у меня было изначально. Я заменил его на точечную нотацию, и, казалось, ничего не изменилось. Я записываю все в папку для компиляции, поэтому мой pathex в моем файле спецификации относится только к этой папке для компиляции, поэтому мне интересно, поможет ли добавление в родительский каталог или каталог tools. Собираюсь попробовать перекомпилировать и посмотреть результаты.