[英]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.