Ошибка импорта при использовании Py2app

Я использую py2app, чтобы упаковать свой скрипт python в виде документа .app на Mac, но обнаруживаю ошибку импорта:

Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/bin/py2applet", line 7, in <module>
from py2app.script_py2applet import main
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/py2app/script_py2applet.py", line 13, in <module>
from plistlib import Plist
ImportError: cannot import name 'Plist' from 'plistlib' (/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/plistlib.py)

И я пытаюсь найти такую ​​​​ошибку через Google, выяснилось, что никто не задавал тот же вопрос, что и мой. Есть ли ошибка с моей собственной настройкой?


person BEntos    schedule 23.07.2018    source источник


Ответы (1)


Это временное исправление, пока не будет выпущено новое обновление в конце этого месяца.

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

Если у вас есть терминал, вы можете найти каталог с помощью:

find ~/ -type f -name “*py2app*”

ФАЙЛ 1

py2app/build_app.py (строка 614)

Заменять:

if isinstance(self.plist, plistlib.Dict):

    self.plist = dict(self.plist.__dict__)

else:

  self.plist = dict(self.plist)

Со следующим:

if not isinstance(self.plist, dict):

    self.plist = dict(self.plist)

ФАЙЛ 2

py2app/create_appbundle.py (строка 26)

Заменять:

dirs = [contents, resources, platdir]

plist = plistlib.Plist()

plist.update(kw)

plistPath = os.path.join(contents, 'Info.plist')

if os.path.exists(plistPath):

    if plist != plistlib.Plist.fromFile(plistPath):

        for d in dirs:

            shutil.rmtree(d, ignore_errors=True)

for d in dirs:

    makedirs(d)

plist.write(plistPath)

Со следующим:

dirs = [contents, resources, platdir]

plistPath = os.path.join(contents, 'Info.plist')

if os.path.exists(plistPath):

    for d in dirs:

        shutil.rmtree(d, ignore_errors=True)

for d in dirs:

    makedirs(d)

plistlib.writePlist(kw, plistPath)

ФАЙЛ 3

py2app/script_py2applet.py (строка 13)

Заменять:

from plistlib import Plist

Со следующим:

import plistlib

Также замените (строка 115)

plist = Plist.fromFile(fn)

Со следующим:

plist = plistlib.fromFile(fn)

Затем вы можете, наконец, создать файл setup.py в каталоге вашего приложения с помощью:

py2applet --make-setup my_project.py

И создайте отдельное приложение с помощью:

python setup.py py2app -A

Вклад в этого парня для большей части приведенного выше кода.

Причина этой проблемы связана с тем, что Plist устаревает в python3.7. См. документацию по Python

person user669132    schedule 24.07.2018
comment
Большое спасибо! Прошел год, а это до сих пор не исправлено в апстриме? - person kakyo; 20.08.2019