我正在使用py2app将python脚本打包为Mac上的.app文档,但发现导入错误:
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搜索这种错误,发现没有人问过与我相同的问题。我自己的设置有任何错误吗?
答案 0 :(得分: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
以上大部分代码对this guy的贡献。
此问题的原因是由于Plist在python3.7中被贬值。 See python docs