Py2App将PIL Dylibs放置在Zip文件中。

问题描述 投票:0回答:1

我有一个使用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

其中,一个人将不得不解压,签署,并重新压缩他们。为什么会发生这种情况,如何防止这种情况的发生,使我不必区别对待?

python code-signing py2app
1个回答
1
投票

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.

© www.soinside.com 2019 - 2024. All rights reserved.