0

我用 Python 创建了一个应用程序,该应用程序经过测试并在我的计算机上完美运行(Mac OSX 10.8.3 Python2.7.3 Postgresql9.2.4 Psycopg2-2.5)。该应用程序是使用 py2app 编译的,我可以看到构建成功地将所有包/模块包含到应用程序内容文件夹中。

Psycopg2 在我的机器上正确导入,并且应用程序运行良好,但是当应用程序在另一台计算机上运行时(我尝试了 4 台不同的计算机......),它无法打开,并且控制台消息显示 ImportError: dlopen(/ Applications/app.app/Contents/Resources/lib/python2.7/psycopg2/_psycopg.so,2):未加载库:libpq.5.dylib

我已经通过 SO 和 Google 广泛搜索和修改了我的代码,但无济于事。psycopg2 链接也没有专门解决这个问题。http://initd.org/psycopg/articles/2010/11/11/links-about-building-psycopg-mac-os-x/

我已经多次删除并重新安装了 psycopg2 和 postgresql,从源代码、macports、自制软件等构建。上面列出了我当前的环境,使用自制软件安装了 postgresql 9.2.4,并在显式链接 pg_config 位置时从源代码安装了 psycopg2-2.5在 setup.cfg

当我在 _psycopg.so 上运行 otool -l 时,我得到以下信息

/usr/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.4.0)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 47.0.0)
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 47.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

我构建的应用程序如何包含(或将目标用户指向文件,如果可用)这些文件?这是正确的方法吗?Py2app 当然不会在“框架”选项中包含来自 /usr/lib/ 的系统文件。

4

1 回答 1

0

您的 _psycopg.so 副本与 libpq 的系统安装相关联,而不是与 postgresql 9.2.4 的自制版本中的 libpq 相关联。

因此,您的应用程序只能在运行 OSX 10.8 的系统上运行。

解决方案是重建 psycopg2 并确保它链接到 PostgreSQL 的自制版本。

请注意,即使明确告知要包含共享库,py2app 也不会将文件从 /usr/lib 复制到应用程序包中,因为它假定 /usr 中的文件是系统文件,并且重新分发这些文件充其量是不可靠的 wrt 许可证。

于 2013-05-15T09:41:47.793 回答