Пакет PyAnstaller .app не открывается на Mac - PullRequest
0 голосов
/ 19 октября 2019

Я создал приложение с графическим интерфейсом wxPython и хочу распространять его для запуска в macOS.

Прежде всего, вот моя структура папок:

root/
├── MyApp.py
|
├── scripts/
|   ├── script.py
|
├── resources/
|   ├── file1.json
|   ├── file2.txt

MyApp.py file run script.py и script.py ссылаются на файлы в папке resources.

Чтобы создать пакет .app, я использовал Pyinstaller примерно так:

cd /path/to/root/folder
pyinstaller MyApp.py --windowed

Это создает файл .app, но он сразу закрывается, когда я пытаюсь открыть его.

Чтобы исследовать проблему, я пошел сюда:

MyApp.app > Contents > MacOS > MyApp (A Unix executable)

Это приложение запускается изТерминал, но я получаю эту ошибку:

FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/ Users / MyAccount / resources'

In script.py, Я получаю ссылку на каталог root, используя os.getcwd(), но при запуске приложения, по-видимому, этот относительный путь не используется при попытке доступа к папке resources. Я очень новичок в этом, поэтому я не уверен, где я могу пойти не так, любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 23 октября 2019

Вы можете использовать информацию о времени выполнения , чтобы получить путь к папке, в которой находится ваш код:

import sys
import os

if getattr(sys, 'frozen', False):
    # this is a Pyinstaller bundle
    root_path = sys._MEIPASS
else:
    # normal python process
    root_path = os.getcwd()

Затем, например, ваш file1.json холодный доступ можно получить с помощью:

path_to_file1 = os.path.join(root_path, 'resources', 'file1.json')

Однако два файла в папке resources, вероятно, не будут включены в папку вашего приложения без указания их в командной строке Pyinstaller (или в файле .spec):

pyinstaller --windowed --add-data "resources/file1.json:resources" --add-data "resources/file2.txt:resources" MyApp.py

Возможно, вы сможете просто указать папку в опции --add-data, например:

pyinstaller --windowed --add-data "resources:resources" MyApp.py

Но я никогда не пробовал именно это.

...