[英]DYLD_LIBRARY_PATH and LD_LIBRARY_PATH cannot be used by python's os and subprocess modules on macOS Sierra
[英]alternatives to DYLD_LIBRARY_PATH/LD_LIBRARY_PATH
我正在开发可在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
的需要,因此我需要DYLD_LIBRARY_PATH和LD_LIBRARY_PATH的替代方法。 我不能将库放在/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"
即使我的一个库最终由于某种我不清楚的原因最终需要直接复制到trunk/src/python/lib/python2.6/lib-dynload
,该技巧在Linux上似乎也能正常工作。 但是,此技巧在OSX上无效。 看来我需要在所有dylibs库上运行install_name_tool
。
我想到的另一个选择是做这样的事情:
ln -s wrapper.sh python
这样我的脚本都可以使用#! ../python
#! ../python
,但出现Unmatched ".
错误。如果我使用#! ../wrapper.sh
。我并不是bash的真正专家...
但是,这些似乎都变得不必要地复杂,这肯定是其他人已经解决的事情了吗? 感谢您的任何建议!
对于python扩展,请考虑使用PYTHONPATH:Python解释器将在PYTHONPATH中搜索.py / .pyc / .pyo / .so模块以及包。 请参阅适用于Python 2.x的 文档以及适用于Python 3.x的文档 ; 特别是在两个页面上名为“模块搜索路径”的部分。 这也引用了似乎表明可以在运行时更新模块搜索路径的信息,如果为true,则意味着您可以将所有逻辑添加到程序中,并且可以自行寻找其库(例如它会在/ usr / libexec / pkgname / ...某处安装副本。
但是,对于除最复杂的情况以外的所有情况,设置PYTHONPATH并使用shell脚本或本机编译的二进制包装器启动核心程序都是可以的方法,并且该方法还用于其他语言环境(包括Mono和Java)中。
不知道这在您的情况下是否可以接受(部分)解决方案,但是让ld在Linux上引起注意的库的另一种方法是将库的路径添加到/etc/ld.so.conf
,然后运行ldconfig
对于Mac,我不记得详细信息,但我认为Apple提供了一些资源来分发打包为.app的应用程序,其中包括库或“框架”的某些默认位置(相对于.app的根目录)给他们打电话。 需要从那里进行谷歌搜索-很抱歉,您对此无济于事,但希望您能有所进步:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.