Отправить заявку py2app Ма c без python - PullRequest
1 голос
/ 21 января 2020

У меня есть приложение tkinter, которое я хотел бы распространить среди моих коллег, у которых не установлено python. Я использую py2app со следующим файлом setup.py

from setuptools import setup

import sys
sys.setrecursionlimit(5000)

#APP would be the name of the file your code is in.
APP = ['Doughnut_stress.py']
DATA_FILES = ['C20.icns']
#The Magic is in OPTIONS.
OPTIONS = {
    'packages': ['tkinter', 'matplotlib'],
    'includes': ['tkinter'],
    'argv_emulation': False,
    'iconfile': 'C20.icns', #change app.icns to the image file name!!!
    'plist': {
        'CFBundleName': 'Axial bearing program',
        'CFBundleDisplayName': 'Axial bearing program',
        'CFBundleGetInfoString': "Calculates C20 axial bearing",
        'CFBundleVersion': "0.0.0",
        'CFBundleShortVersionString': "0.0.0",
        'NSHumanReadableCopyright': u"Copyright © 2020, Component 2.0 A/S, All Rights Reserved"
    }
    }

setup(
    app=APP,
    name='Axial bearing program', #change to anything
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

Затем я использую

python setup.py py2app

для компиляции программы в приложение. Обратите внимание, что у меня есть символическая ссылка python до python3. Моя python 3 - это версия 3.7.5, которая устанавливается через MacPorts. py2app - версия 0.20, а tkinter - версия 8.6

Программа прекрасно компилируется, и я могу запустить ее из терминала, или просто дважды щелкнуть файл приложения, и она работает как задумано.

Однако, когда я отправляю его своему коллеге и пытаюсь открыть его со своего компьютера, дважды щелкнув приложение, появляется всплывающее окно, где я могу выбрать «Открыть консоль» или «Завершить». Если я запускаю программу через терминал (запустив APP_NAME.app/Contents/MacOS/APP_NAME), я получаю следующую ошибку

Traceback (most recent call last):
  File "/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/Resources/__boot__.py", line 416, in <module>
    _run()
  File "/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/Resources/__boot__.py", line 394, in _run
    exec(compile(source, path, "exec"), globals(), globals())
  File "/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/Resources/Doughnut_stress.py", line 31, in <module>
    root = Tk()
  File "tkinter/__init__.pyc", line 2023, in __init__
_tkinter.TclError: Can't find a usable init.tcl in the following directories: 
    /opt/local/lib/tcl8.6 {/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/lib/tcl8.6} {/Users/prm/Downloads/Component 2.0 axial bearing program.app/lib/tcl8.6} {/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/library} {/Users/prm/Downloads/Component 2.0 axial bearing program.app/library} {/Users/prm/Downloads/Component 2.0 axial bearing program.app/tcl8.6.9/library} /Users/prm/Downloads/tcl8.6.9/library



This probably means that Tcl wasn't installed properly.

2020-01-20 15:54:28.439 Component 2.0 axial bearing program[34251:2906750] Component 2.0 axial bearing program Error

Я также могу запустить включенный файл python в APP_NAME.app/Contents / MacOS / python, которая выдает эту ошибку

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x000000010d0f8dc0 (most recent call first):
Abort trap: 6

Кто-то еще писал об этом в Reddit некоторое время go, но ответа не было https://www.reddit.com/r/learnpython/comments/c1on6f/py2app_in_a_mac_without_python/

Как я могу это исправить, чтобы я мог распространять свое python приложение?

1 Ответ

0 голосов
/ 24 апреля 2020

У меня была та же проблема, что и у вас, за исключением того, что я использовал pygame. Вот быстрое решение:

Вместо простого python setup.py py2app, попробуйте:

python setup.py py2app --packages="encodings"

(Для меня я сделал python setup.py py2app --packages="pygame" и это сработало)

...