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
を使用するには、スクリプトの 1 つを呼び出す必要があります。私の目標は、単に実行できるようにすることです。これは、インストール パスに存在する場合、関連する python とライブラリを見つけることができるはずです。目的は、ユーザーの実行を簡素化し、nosetests などの外部ツールの使用を簡素化することです。app.py
私のバージョンのpythonをビルドするときに、1つの代替手段は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
私のライブラリの1つが何らかの理由で直接コピーする必要があったとしても、このトリックはLinuxでうまくいくようです。ただし、このトリックは OSX では機能しません。install_name_tool
すべての dylibs ライブラリで実行する必要があるようです。
私が思いついた他の選択肢は、次のようなことをすることでした:
ln -s wrapper.sh python
私のスクリプトがすべて使用できるようにしまし#! ../python
たが、Unmatched ".
エラーが発生しました。を使っても同じです#! ../wrapper.sh
。私は本当にbashの専門家ではありません...
しかし、これらはすべて不必要に複雑に思えますが、これは他の人が解決したものなのでしょうか?? アドバイスをありがとう!