python - 我应该如何将 cx_freeze 与 Macports 库一起使用?

标签 python macos macports cx-freeze

我目前使用的是 Python.org 的 Python 3.4 Mac OS X 版本。我使用的 Python 模块依赖于我在 Macports 中构建的库。该脚本不能立即运行:

Traceback (most recent call last):
  File "magnetx.py", line 6, in <module>
    import yara
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so, 2): Library not loaded: /usr/local/lib/libyara.3.dylib
  Referenced from: /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so
  Reason: image not found

如果我设置环境变量,我可以解决这个问题

export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"

不幸的是,它不满足cx_freeze。当它应该在 /opt/local/lib 中查找时,它却一直在 /usr/local/lib 中查找。

copying /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so -> build/exe.macosx-10.6-intel-3.4/yara.so copying /usr/local/lib/libyara.3.dylib -> build/exe.macosx-10.6-intel-3.4/libyara.3.dylib error: [Errno 2] No such file or directory: '/usr/local/lib/libyara.3.dylib'

我也许可以在 Macports 中构建 Python,但这似乎是不必要的。关于如何解决这个问题有什么想法吗?

最佳答案

在 OS X 上,使用绝对路径引用依赖库。复制到二进制文件中的路径取决于您在构建时链接的库的所谓“安装名称”。在您的情况下,yara.so 没有引用您希望加载的库。让我们探讨一下出现这种情况的几个原因,以及解决这个问题的几种方法:

  • 我已验证 MacPorts(在我的系统上)安装的 libyara.dylib 的安装名称为 /opt/local/lib/libyara.0.dylib。有时,构建不使用跨平台库构建工具的系统,并且不希望 OS X 的特性将其搞乱(并使用相对路径或 /usr/local/lib)。如果是这种情况,这将是软件构建系统中的一个错误,可以使用 install_name_tool(1)-id 标志手动修复该错误(在链接到图书馆)。
  • 您的 yara.so 副本可能是针对驻留在 /usr/local/lib 中的不同版本的 libyara.dylib 构建的>。这可以解释为什么您的 yara.so 不包含 libyara.dylib 的 MacPorts 副本的正确绝对路径,但它也可以防止您看到的错误首先发生的情况是,除非您在构建时在 /usr/local/lib 中有一个副本并随后将其删除。正如您已经看到的,您可以指示 OS X 的加载程序使用 DYLD_* 系列环境变量搜索不同的路径。我认为这对 cx_freeze 不起作用的原因是它不关注 DYLD_* 系列变量。
  • 如果您确定在 /usr/local/lib 中找到的 libyara.dylib yara.so 副本是二进制文件- 与/opt/local/lib中的兼容,您可以使用install_name_tool手动修改yara.so中的库加载命令以指向后一个路径(1)-change old new参数,例如install_name_tool -change/usr/local/lib/libyara.3.dylib/opt/local/lib/libyara.0.dylib/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site -packages/yara.so。这本质上是在设置 DYLD_FALLBACK_LIBRARY_PATH 时使用加载程序为您所做的更改来修改二进制文件。由于库的主要版本号似乎不同,这可能不是一个安全的假设。
  • 如果您不知道 yara.so 是否与 MacPorts 的 libyara.0.dylib 版本兼容,您可以而且应该重新编译 yara。所以。如果重新编译成功,您应该能够使用 otool -L yara.so 检查库加载命令,并查看以 /opt/local 开头的路径那里(前提是 otool -D/opt/local/lib/libyara.0.dylib 正确指向自身)。

编辑:我刚刚重新检查并注意到我的 MacPorts 版本的库版本号与您的系统期望的版本号不同。对我来说,这听起来很像案例 2。

关于python - 我应该如何将 cx_freeze 与 Macports 库一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30728006/

相关文章:

无需安装即可下载MacPorts依赖项

python - 如何将 MacPort 的 pyqt 链接到 Enthought 的 Python 发行版?

multithreading - Mac OS-X 10.5上的g++ 4.6 std::thread错误

python - Django MySql 原始查询错误 - 参数索引超出范围

python - 保留 pandas df 的行在给定列中包含给定列表中的子字符串

javascript - 更改Python中的默认日期打印格式

swift - macOS 催化剂上钥匙串(keychain)项目的 PersistentRef

python - VIM:预览高度

python - 已安装 Python 模块上的 ImportError

objective-c - 让我的 NSSecureTextField 触发 NSButton