【问题标题】:Use py2app to package pyside program error include imageformats plugins使用py2app打包pyside程序报错include imageformats plugins
【发布时间】:2013-02-27 07:27:22
【问题描述】:

setup.py

APP = ['systray.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': True,
           'includes': ['djmemori.settings'],
           'packages': ['django', 'south'],
           'qt_plugins': 'imageformats' # if I comment out this line, python setup.py py2app will success
           }

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

python setup.py py2app

...
copying file /Users/teamx/workspace/env-memori-pkg/lib/python2.7/site-packages/py2app/recipes/qt.conf -> /Users/teamx/workspace/memori_pc/src/djmemori/dist/systray.app/Contents/Resources/qt.conf
copying file /Developer/Applications/Qt/plugins/imageformats/libqgif.dylib -> /Users/teamx/workspace/memori_pc/src/djmemori/dist/systray.app/Contents/Resources/qt_plugins/imageformats/libqgif.dylib
copying file /Developer/Applications/Qt/plugins/imageformats/libqico.dylib -> /Users/teamx/workspace/memori_pc/src/djmemori/dist/systray.app/Contents/Resources/qt_plugins/imageformats/libqico.dylib
copying file /Developer/Applications/Qt/plugins/imageformats/libqjpeg.dylib -> /Users/teamx/workspace/memori_pc/src/djmemori/dist/systray.app/Contents/Resources/qt_plugins/imageformats/libqjpeg.dylib
copying file /Developer/Applications/Qt/plugins/imageformats/libqmng.dylib -> /Users/teamx/workspace/memori_pc/src/djmemori/dist/systray.app/Contents/Resources/qt_plugins/imageformats/libqmng.dylib
copying file /Developer/Applications/Qt/plugins/imageformats/libqsvg.dylib -> /Users/teamx/workspace/memori_pc/src/djmemori/dist/systray.app/Contents/Resources/qt_plugins/imageformats/libqsvg.dylib
copying file /Developer/Applications/Qt/plugins/imageformats/libqtiff.dylib -> /Users/teamx/workspace/memori_pc/src/djmemori/dist/systray.app/Contents/Resources/qt_plugins/imageformats/libqtiff.dylib
copying file /.dbfseventsd -> /Users/teamx/workspace/memori_pc/src/djmemori/dist/systray.app/Contents/Resources/qt_plugins/imageformats/.dbfseventsd
error: /.dbfseventsd: Operation not supported on socket

【问题讨论】:

    标签: pyside py2app


    【解决方案1】:

    更改代码 py2app/recipes/pyside.py:21

        if '*' in item:
            for path in glob.glob(os.path.join(plugin_dir, item)):
                resources.append((os.path.dirname('qt_plugins' + path[len(plugin_dir):]), [path]))
            else:
                resources.append((os.path.dirname(os.path.join('qt_plugins', item)), os.path.join(plugin_dir, item)))
    

        if '*' in item:
            for path in glob.glob(os.path.join(plugin_dir, item)):
                resources.append((os.path.dirname('qt_plugins' + path[len(plugin_dir):]), [path]))
        else:
            resources.append((os.path.dirname(os.path.join('qt_plugins', item)), os.path.join(plugin_dir, item)))
    

    可以解决这个问题。

    代码缩进问题会导致py2app添加资源:

    ('qt_plugins/imageformats', u'/Developer/Applications/Qt/plugins/imageformats/*') # 注意元组的第二项应该是列表,但这里是字符串

    然后在 py2app/build_app.py:598

    def iter_data_files(self):
        dist = self.distribution
        allres = chain(getattr(dist, 'data_files', ()) or (), self.resources)
        for (path, files) in (normalize_data_file(fn) for fn in allres):
            path = fsencoding(path)
            for fn in files:                      # <-- this line
                fn = fsencoding(fn)
                yield fn, os.path.join(path, os.path.basename(fn))
    

    files 应该是一个列表,但现在,它是一个字符串:u'/Developer/Applications/Qt/plugins/imageformats/*' 这将导致py2app复制路径中的文件:'/','D','e','v',... 于是py2app开始迭代根路径'/',遇到/.dbfseventsd时就崩溃了。

    【讨论】:

      【解决方案2】:

      这看起来像是 py2app 中的一个错误。您能否帮我检查一下“/Developer/Applications/Qt/plugins/imageformats”中是否有一个名为“.dbfseventsd”的文件(或指向该文件的符号链接)?

      另外,请在https://bitbucket.org/ronaldoussoren/py2app 提交问题,以确保我不会忘记实际解决问题。

      【讨论】:

      • 嗨,Ronald Oussoren,“/Developer/Applications/Qt/plugins/imageformats”中似乎没有“.dbfseventsd”。但是根路径中有一个。
      • 你是如何安装 PySide 和 Qt 的?您是否使用了从 qt-project.org/wiki/PySide_Binaries_MacOSX> 引用的二进制文件?
      • 是的,我从那个链接安装了 PySide 和 Qt。 @Ronald Oussoren。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2013-05-06
      • 2020-10-22
      • 1970-01-01
      • 2013-03-15
      相关资源
      最近更新 更多