【问题标题】:How can I force Python to use specific libraries ( psycopg2 & osx )?如何强制 Python 使用特定库( psycopg2 和 osx )?
【发布时间】:2013-08-02 19:55:53
【问题描述】:

我弄清楚了当前许多 osx 安装的根本问题是什么(例如 http://psycopg.lighthouseapp.com/projects/62710/tickets/111-library-not-loaded-libssl100dylibpython pip install psycopg2 install error

很多人使用 EnterpriseDB 的 PostgreSQL 安装程序;可能是因为它是http://www.postgresql.org/download/macosx/ 中的第一个选项

如果您使用它进行安装,它会将所有需要的二进制文件和库安装到它的私有版本化空间中...

/Library/PostgreSQL/9.2/bin
/Library/PostgreSQL/9.2/lib

/Library/PostgreSQL/8.4.5/bin
/Library/PostgreSQL/8.4.5/lib

如果我运行 pg_config(它指向 /Library/PostgreSQL/v/bin/pg_config ),它会提供正确的信息

LIBDIR = /Library/PostgreSQL/9.2/lib

但是,导入 psycopg2 的所有错误似乎都表明 psycopg2 正在尝试从 /usr/local/lib 加载,而不是它编译时针对(或应该预期的)的 lib

我尝试使用环境变量( LD_LIBRARY_PATH , LD_PRELOAD ),但似乎无法完成这项工作。除非(正确的)文件是 /usr/local/lib ,否则 psycopg2 不想导入。

我不喜欢其他人在这里提到的重写或链接这些文件的解决方案;必须有一种方法可以强制 Python / psycopg2 使用预期的文件路径。

【问题讨论】:

  • 你必须查看你的库是如何链接的(通过运行otool -L 来对抗它)。如果其中有硬编码的绝对路径,你别无选择,只能使用install_name_tool 来更改它们(除非你想将依赖项符号链接到它想要的绝对路径中)。
  • 顺便说一句,这是一个奇怪的安装布局——它有点像一个框架,有点像一个传统的 Unix /opt 子目录,但实际上两者都不是。因此,我不确定您是否可以期望标准的 OS X 机制透明地使用它。
  • 对不起,应该提到这一点。我已经通过 otool 进行了检查(这是我首先想到的);所涉及的一切都只是库名称(只有一个硬编码路径,涉及其他内容)。无论出于何种原因,python 只是不想在 /usr/local/lib 之外查看

标签: python postgresql psycopg2


【解决方案1】:

您的问题是您使用了错误的环境变量。

LD_LIBRARY_PATH 被 linux/glibc、FreeBSD 和一些其他 *nix 平台的链接加载器使用,但对于 Mac OS X 链接加载器。查看manpage for dyld 了解确实存在的内容。

明显的替换是DYLD_LIBRARY_PATH。但是,这可能不是您想要的(出于相同的基本原因LD_LIBRARY_PATH 通常是您在 linux 上想要的,但细节不同)。相反,您可能想要DYLD_FALLBACK_LIBRARY_PATH。简而言之,这样做是更改用于在主搜索路径中未找到的库的 fallback 搜索路径(通常为~/lib:/usr/local/lib:/lib:/usr/lib),而不是更改主搜索路径,因此您可以提供缺少的库,不阻塞实际存在的库。 (尝试以各种方式运行任何 X11 应用程序,以非常简单地演示差异。)手册页解释了详细信息。

(顺便说一句,如果你想知道 OS X 的链接加载器有什么特别之处,以至于他们觉得需要使用不同的环境变量,这主要是关于框架和版本控制,尽管你可以嵌入的自定义魔法路径也是相关。NeXT 或 Apple 的某个人可能认为,使用相同的名称来表示 80% 相同但 20% 不同的东西会更有误导性而不是有帮助......)

【讨论】:

  • 谢谢。我正在和一位曾经管理一些更受欢迎的软件包安装程序的朋友交谈,他也用DYLD_FALLBACK_LIBRARY_PATH 纠正了我。我今晚会试一试。他还建议通过使用install_name_tool 来修复_psycopg.so 以寻址正确的库。我也打算调查一下。
猜你喜欢
  • 2018-04-26
  • 2014-04-29
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2013-04-03
相关资源
最近更新 更多