1

我正在开发用于 OSX 和 linux 的 python C++ 扩展。目前,我可以使用包装脚本运行我的代码wrapper.sh

#!/bin/bash                                                                                                                              
trunk=`dirname $0`                                                                                                                       
trunk=`cd $trunk; pwd`                                                                                                                   
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$trunk/lib                                                                                   
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$trunk/lib/:$trunk/src/hdf5/lib/:$trunk/src/python/lib                                           
$trunk/src/python/bin/python "$@" 

它能够像这样设置我的运行:wrapper.sh app.py

我想做的是消除对wrapper.sh. 我不能将我的库放在某个标准位置,比如/usr/local/lib因为在我的机器上,我维护了我的库的几个独立实例。也就是说,我的库需要保存在相对于我的安装路径的某个位置。出于同样的原因,我不能将这些环境变量放在我的登录脚本中。目前,我需要调用我的一个wrapper.sh脚本来使用相关的库。我的目标是能够运行app.py,如果它位于我的安装路径中,应该能够找到它相关的 python 和库。目的是简化用户的执行,并简化外部工具(如鼻子测试)的使用。

当我构建我的 python 版本时,一种替代方法似乎是使用 rpath:

./configure --enable-shared --prefix=$(CURDIR)/$(PYTHON_DIR) LDFLAGS="-Wl,-rpath,$(CURDIR)/lib/ -Wl,-rpath,$(CURDIR)/src/hdf5/lib -Wl,-rpath,$(CURDIR)/src/python/lib"

这个技巧似乎在 linux 上运行良好,尽管trunk/src/python/lib/python2.6/lib-dynload由于某种我不清楚的原因最终需要将我的一个库直接复制到其中。但是,这个技巧不适用于 OSX;看起来我需要install_name_tool在我所有的 dylibs 库上运行。

我想出的另一种选择是做这样的事情:

ln -s wrapper.sh python

这样我的脚本都可以使用#! ../python,但我遇到了Unmatched ".错误。如果我使用#! ../wrapper.sh. 我不是真正的bash专家......

然而,这些都显得如此不必要的复杂,这肯定是其他人已经解决的问题??感谢您的任何建议!

4

2 回答 2

0

对于 python 扩展,考虑使用 PYTHONPATH:Python 解释器将在 PYTHONPATH 中搜索 .py/.pyc/.pyo/.so 模块以及包。请参阅Python 2.x的文档以及Python 3.x的文档;特别是两个页面上名为“模块搜索路径”的部分。这也引用了似乎表明可以在运行时更新模块搜索路径的信息,如果为真,则意味着您可以将所有逻辑添加到您的程序中,并且它可以自行搜索其库(例如,如果它在 /usr/libexec/pkgname/... 某处或某处安装一个副本)。

但是,除了最复杂的情​​况外,设置 PYTHONPATH 并使用 shell 脚本或本机编译的二进制包装器来启动核心程序是一种不错的方法,并且在包括 Mono 和 Java 在内的其他语言环境中也使用了这种方法。

于 2010-12-16T20:05:25.880 回答
0

不确定这在您的情况下是否是可接受的(部分)解决方案,但另一种让 ld 在 linux 上注意到库的方法是将库的路径添加到/etc/ld.so.conf然后运行ldconfig

对于 Mac,我不记得细节,但我认为 Apple 提供了一些资源来分发打包为 .app 的应用程序,其中包括一些库的默认位置(相对于 .app 的根目录)或“框架”,因为它们给他们打电话。需要从那里进行一些谷歌搜索 - 抱歉对此无能为力,但希望你能取得一些进展:-)

于 2010-12-16T20:06:09.120 回答