#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. Собираюсь попробовать перекомпилировать и посмотреть результаты.