Бинарный файл Pyinstaller не работает с конфигурацией PRAW

Я загрузил и установил Pyinstaller через pip с целью создания двоичного файла .exe, который можно было бы использовать отдельно в Windows. Мое приложение / скрипт в основном похоже на this, загружая изображения из определенного субреддита (который доступен без учетной записи Reddit).

Запуск сценария .py через консоль или через мою среду IDE работает должным образом как в Linux, так и в Windows. Согласно документации PRAW, должен быть C:\Users\myName\AppData\praw.ini файл конфигурации post- PRAW, но в настоящее время он отсутствует в моей системе, но, как я уже упоминал, скрипт отлично работает в интерпретаторе python.

Упаковка его в .exe с помощью Pyinstaller работает нормально, но его запуск (с правами администратора или без них) не выполняется со следующей ошибкой

C:\Users\John\IdeaProjects\monsteraday-subreddit-image-downloader\dist>monsteraday-image-downloader.exe
Traceback (most recent call last):
  File "<string>", line 5, in <module>
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py",
 line 363, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Python27\lib\site-packages\praw\__init__.py", line 40, in <module>
    from praw.settings import CONFIG
  File "C:\Python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py",
 line 363, in load_module
    exec(bytecode, module.__dict__)
  File "C:\Python27\lib\site-packages\praw\settings.py", line 47, in <module>
    CONFIG = _load_configuration()
  File "C:\Python27\lib\site-packages\praw\settings.py", line 45, in _load_configuration    .format(locations))
Exception: Could not find config file in any of: [u'C:\\Users\\John\\AppData\\Local\\Temp\\_MEI52442\\praw\\praw.ini', u'C:\\Users\\John\\AppData\Roaming\\praw.ini', u'praw.ini']
monsteraday-image-downloader returned -1

Здесь я должен уточнить, что оба

  • запуск python myscript.py в консоли
  • выполнение сгенерированного pyinstaller myscript.exe через консоль или двойной щелчок

Были опробованы на той же машине Win8.1 x64 с установленными всеми необходимыми библиотеками (включая PRAW), 32-разрядной версией Python 2.7 (для совместимости целевого .exe) и отсутствующей конфигурацией user praw.ini из / AppData / dir, а global praw.ini правильно в C:\Python27\Lib\site-packages\praw\praw.ini

В документации Pyinstaller упоминается использование файла .spec для включения внешних файлов в обернутый .exe, но я не вижу, как это играет какую-либо роль, поскольку мне уже не хватает / не нужен praw.ini конфигурация. Py2exe также дает те же результаты. Как я могу исправить это и создать простой способ использования этого инструмента?


person jathanasiou    schedule 12.11.2015    source источник
comment
В документации не говорится, что в AppData нужен ini. В нем говорится, что ini необходим, но global ini всегда существует в месте расположения пакета. Пользовательский ini может отображаться в AppData для переопределения настроек. Если пакет не установлен на машине, глобального ini не будет, и сценарий, вероятно, завершится ошибкой. Вы пытались запустить исполняемый файл на машине, на которой не установлен PRAW?   -  person Panagiotis Kanavos    schedule 12.11.2015
comment
Трассировка стека довольно ясна: PRAW перед ошибкой проверил только пользовательское и локальное расположение ini. При проверке исходного кода пакета выясняется, что местоположение не найдено в строке 31 . Это может быть проблемой, связанной с тем, как PyInstaller импортирует пакеты, судя по другим вопросам SO.   -  person Panagiotis Kanavos    schedule 12.11.2015
comment
@PanagiotisKanavos Другими словами, мне, вероятно, нужно упаковать глобальную конфигурацию .ini praw через файл .spec pyinstaller?   -  person jathanasiou    schedule 12.11.2015
comment
Необязательно, нашел этот аналогичный вопрос для Linux. В этом случае проблема с разрешениями скрывала файл от учетной записи пользователя. Для проверки можно использовать Process Monitor для ошибок ЗАПРЕЩЕН В ДОСТУПЕ при запуске вашего приложения, чтобы проверить, действительно ли это проблема   -  person Panagiotis Kanavos    schedule 12.11.2015
comment
Разве тот факт, что я пытался (несколько раз) запустить от имени администратора на консоли, которую я использовал для запуска .exe, не должен охватывать описанный вами сценарий разрешений?   -  person jathanasiou    schedule 12.11.2015
comment
Нет, точно так же, как это не помогло в вопросе о LInux. as admin эквивалентно sudo, он не дает вам дополнительных разрешений.   -  person Panagiotis Kanavos    schedule 13.11.2015


Ответы (1)


На основе последней строки вывода

Exception: Could not find config file in any of: [u'C:\\Users\\John\\AppData\\Local\\Temp\\_MEI52442\\praw\\praw.ini', u'C:\\Users\\John\\AppData\Roaming\\praw.ini', u'praw.ini']

Кажется, что PRAW при запуске из упакованного .exe ищет свой файл конфигурации 'praw.ini' в 3 разных местах.

  1. Временная папка, созданная в системных каталогах пользователя, предположительно в соответствии с инструкциями pyinstaller.
  2. Папка роуминга пользователя (в Windows)
  3. ., по тому же пути запускается .exe из

Теперь давайте посмотрим, что мы можем сделать, чтобы попасть в хотя бы одно из этих случаев.

  1. Возможно, удастся настроить параметры pyinstaller и файл .spec таким образом, чтобы он брал определенный файл praw.ini (например, глобальный, найденный в папке установленных пакетов Pytho для PRAW) и помещал его во временную папку, чтобы сценарий мог использовать, но, похоже, нет простого / прямого способа сделать это. Это определенно кажется наиболее "правильным" способом сделать это.
  2. Размещение конфигурационного файла каждым пользователем плохо для UX, и этого следует избегать, если, конечно, для этого не используется автоматическая установка, что может быть излишним, если мы говорим о небольшой программе.
  3. Последний вариант не идеален, но это достойный компромисс, и его определенно легко использовать со стороны разработчика. Все, что требуется, - это разместить praw.ini в той же папке, из которой он / она запускает .exe. Исполняемый файл может быть размещен в архиве .zip, содержащем копию praw.ini, так что при запуске пользователем он будет полностью работоспособен без дополнительных усилий от его имени.

Несмотря на то, что на самом деле это обходной путь, последний вариант обеспечивает достаточно простоту, чтобы инструмент мог работать из коробки для обычного пользователя.

person jathanasiou    schedule 12.11.2015
comment
На самом деле это неверно и делает некоторые неверные предположения. Приложения должны хранить свои данные в папке AppData профиля пользователя, а не в папке приложения, как из соображений безопасности (Program Files доступны только для чтения, чтобы предотвратить вмешательство), так и из соображений управляемости (перемещаемый профиль следует за пользователем. на всех машинах, в которые он входит, хорошо известна приложениям резервного копирования и имеет автоматическое резервное копирование). Файл конфигурации, который не меняется, должен храниться в папке программы. Итак, ни один из этих вариантов не является обходным путем, но в этом случае правильным будет # 3. - person Panagiotis Kanavos; 13.11.2015
comment
Кроме того, PRAW не меняет своего поведения при запуске из упакованного exe - он всегда проверяет все четыре папки (package, temp, appdata, local). Источник доказывает, что - person Panagiotis Kanavos; 13.11.2015
comment
В любом случае, если вы хотите развернуть exe на машине, на которой не установлен пакет, вам нужно будет где-то предоставить файл конфигурации. - person Panagiotis Kanavos; 13.11.2015
comment
@Panagiotis да, я пришел к такому же выводу. Я в основном упоминал первые два случая ради завершения, так как они казались допустимыми вариантами, даже если они были недоступны, насколько мне известно. Однако странно то, что, согласно опубликованному мной исключению, PRAW упоминает только 3 места. Кажется, он не проверяет каталог установленных пакетов pythons (где у меня был единственный ini) и, возможно, поэтому он не запускается даже на машинах с установленным PRAW. - person jathanasiou; 13.11.2015