pyinstaller, похоже, не находит файл данных
Edit 3: Я заменил __file__
С sys.argv[0]
, когда мне нужно знать местоположение моего скрипта/исполняемый. Это не совсем то же самое, но в моем случае он работает нормально (по крайней мере, на исполняемой версии...). Теперь все работает нормально, в режиме одного файла, с использованием функции принятого ответа для доступа к файлам ресурсов!
Edit 2: как показано в комментариях принятого ответа, проблема исходит из разрешения пути в моем скрипте; я пытаюсь использовать __file__
получить расположение скрипта, чтобы я мог получить доступ к его файлам ресурсов. Это не работает после упаковки, как __file__
возвращает имя файла из Python.dll
к скрипту, поэтому совсем всегда нет пути и только имя файла. Поэтому я должен найти другой трюк, чтобы получить доступ к файлам ресурсов; обходной путь на данный момент-переместить текущий каталог в исполняемый путь.
кстати, это означает, что ConfigParser должен сообщать о проблеме при доступе к файлу, а не о том, что раздел недостающий.
я обновлю этот вопрос с тем, как я решил этот вопрос разрешения пути.
у меня проблемы с pyinstaller
, и поскольку я использую его в первый раз, он уверен, что я сделал что-то не так.
Итак, вот в чем проблема:pyisntaller
работает плавно на скрипте, который я написал, и генерирует некоторые вещи в . Хорошо, теперь я хочу выполнить его, чтобы увидеть, все ли прошло хорошо, и вот что я получаю:
C:Program FilesPyInstallerpyinstaller-1.5.1>p_tooldistp_toolp_tool.exe -?
Traceback (most recent call last):
File "<string>", line 104, in <module>
File "p_toolbuildpyi.win32p_tooloutPYZ1.pyz/logging.config", line 76, in f
ileConfig
File "p_toolbuildpyi.win32p_tooloutPYZ1.pyz/logging.config", line 112, in
_create_formatters
File "p_toolbuildpyi.win32p_tooloutPYZ1.pyz/ConfigParser", line 532, in ge
t
ConfigParser.NoSectionError: No section: 'formatters'
мой первой мыслью было, что logging.conf
файл отсутствовал, поэтому я добавил его (и некоторые другие файлы ресурсов) в p_tool.spec
файл, но это не лучше.
версия Python: 2.6.6, под WinXP. Я использую pyinstaller
как я нужно, чтобы упаковать файлы на Солярис станции.
Итак, у кого-нибудь была эта проблема? Единственная тема, связанная со следующим вопросом:Проблема PyInstaller, очень близко к моей проблеме, но безнадежно его нет ответ.
Edit3: подробности о регистрации удалены, поскольку на самом деле не связаны с проблемой.
3 ответов
во-первых, было бы разумно сделать печать config_file / os.путь.существует (config_file) перед его чтением, поэтому вы можете быть уверены, где находится файл и может ли python его найти.
Что касается фактического доступа к нему, os.path.split(__file__)
выглядит почти правильно, но я не уверен, что он работает правильно под pyinstaller - правильный способ упаковки файлов-добавить их в .spec-файл, pyinstaller затем загрузит их во время компиляции и распакует их в $_MEIPASS2/ во время выполнения. Чтобы получить _meipass2 dir в packed-mode и использовать локальный каталог в режиме распаковки (разработки), я использую это:
def resource_path(relative):
return os.path.join(
os.environ.get(
"_MEIPASS2",
os.path.abspath(".")
),
relative
)
# in development
>>> resource_path("logging.conf")
"/home/shish/src/my_app/logging.conf"
# in deployment
>>> resource_path("logging.conf")
"/tmp/_MEI34121/logging.conf"
сообщение об ошибке ConfigParser.NoSectionError: No section: 'formatters'
предполагает, что это не отсутствующий файл, а файл с отсутствующим разделом, который вы должны искать.
у меня была аналогичная проблема, но пока не удалось найти элегантное решение. "Хак", который я использую, получил меня корыто, скажем, мой проект находится в '~/project/project_root'
, сначала на .файл спецификации:
excluded_sources = TOC([x for x in a.pure if not x[0].startswith('project_root')])
вот это Analysis
объект, в основном я удаляю все мои файлы проектов из PYZ
таким образом, импорт не передается туда, и относительные пути регистратора не будут вычисляться оттуда. После этого создайте Tree
объект из проекта.
my_project_tree = Tree('~/project')
затем добавьте это дерево в список TOC, который передается для сбора, так:
COLLECT( exe,
a.binaries,
a.zipfiles,
a.datas,
my_project_tree,
....)
вы должны добавить папку проекта в папку dist. Проблема в том, что вы в конечном итоге распространяете pyc вашего проекта, но пока не смогли найти лучшего способа. Очень заинтересован в действительном решении.