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 вашего проекта, но пока не смогли найти лучшего способа. Очень заинтересован в действительном решении.