1

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
4

2 に答える 2

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/*') # タプルの 2 番目の項目はリストにする必要がありますが、ここでは文字列であることに注意してください

そして 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 に遭遇すると、クラッシュしました。

于 2013-03-01T07:41:20.860 に答える
0

これは py2app のバグのようです。「/Developer/Applications/Qt/plugins/imageformats」に「.dbfseventsd」という名前のファイル (またはそのファイルを指すシンボリック リンク) があるかどうかを確認できますか?

また、実際に問題を修正することを忘れないように、 https://bitbucket.org/ronaldoussoren/py2appで問題を報告してください。

于 2013-02-27T10:22:06.263 に答える