我正在开发用于 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专家......
然而,这些都显得如此不必要的复杂,这肯定是其他人已经解决的问题??感谢您的任何建议!