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。そのため、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の専門家ではありません...

しかし、これらはすべて不必要に複雑に思えますが、これは他の人が解決したものなのでしょうか?? アドバイスをありがとう!

4

2 に答える 2

0

Python 拡張機能については、PYTHONPATH の使用を検討してください。Python インタープリターは、PYTHONPATH で .py/.pyc/.pyo/.so モジュールとパッケージを検索します。Python 2.xドキュメントと Python 3.x のドキュメントを参照してください。具体的には、両方のページの「モジュール検索パス」という名前のセクションです。これは、実行時にモジュール検索パスを更新できることを示していると思われる情報も参照しています。これが真の場合、そのすべてのロジックをプログラムに追加でき、独自にライブラリを検索できることを意味します (たとえば、 /usr/libexec/pkgname/... どこかにコピーをインストールします)。

ただし、最も複雑な場合を除いて、PYTHONPATH を設定し、シェル スクリプトまたはネイティブ コンパイルされたバイナリ ラッパーを使用してコア プログラムを開始することは、問題のないアプローチであり、Mono や Java などの他の言語環境でも使用されています。

于 2010-12-16T20:05:25.880 に答える
0

これがあなたの状況で受け入れられる (部分的な) 解決策であるかどうかはわかりませんが、Linux で ld によってライブラリを認識させる別の方法は、ライブラリへのパスを追加してから/etc/ld.so.conf実行することです。ldconfig

Mac の場合、詳細は覚えていませんが、Apple は、ライブラリのデフォルトの場所 (.app のルートに関連する) を含む .app としてパッケージ化されたアプリを配布するためのリソース、または「フレームワーク」を提供していると思います。彼らへ電話します。そこからグーグルで検索する必要があります-申し訳ありませんが、それ以上のことはできませんが、進歩が見られることを願っています:-)

于 2010-12-16T20:06:09.120 に答える