我有一个使用Python Imaging Library (PIL)的python应用程序,并使用Py2app进行打包。Numpy dylibs 在应用程序的内容目录中。
demo.app/Contents/Resources/lib/python3.8/numpy/.dylibs/libgcc_s.1.dylib
在那里可以搜索和签署,但PIP dylibs在一个叫 python3.8.zip
档案
demo.app/Contents/Resources/lib/python3.zip -> ./PIL/.dylibs/libfreetype.6.dylib
其中,一个人将不得不解压,签署,并重新压缩他们。为什么会发生这种情况,如何防止这种情况的发生,使我不必区别对待?
py2app
实现了对某些包的特殊处理,通过一个叫做 "食谱". 它内置了某些套餐的配方,包括 numpy
这也是为什么numpy被排除在 .zip
文件。 (这是内置的numpy配方。)
除了内置的食谱,您还可以 定义自己的食谱 供py2app使用。 只要定义一个有 check
方法,并将其作为一个归属匹配到 py2app.recipes
:
# In setup.py
class PIL_recipe:
def check(self, cmd, mf):
m = mf.findNode("PIL")
if m is None or m.filename is None:
return None
# Exclude from site-packages.zip
return {"packages": ["PIL"]}
py2app.recipes.PIL = PIL_recipe()
...
setup(...)
如果你需要对多个库进行操作,你可以将这个技巧通用化,这样就不会硬编码包名了。
class ExcludeFromZip_Recipe(object):
def __init__(self, module):
self.module = module
def check(self, cmd, mf):
m = mf.findNode(self.module)
if m is None:
return None
# Don't put the module in the site-packages.zip file
return {"packages": [self.module]}
for module in ['PIL', 'skimage', 'sklearn', 'jsonschema']:
setattr( py2app.recipes, module, ExcludeFromZip_Recipe(module) )
声明:这是我过去解决这个问题的方法。 但我不知道为什么你的zip文件被命名为 python3.zip
而不是 site-packages.zip
.