純粋なモジュールとスクリプトの両方をすべて同じフォルダー内に含むPythonパッケージを作成しました。スクリプトはモジュール内の機能を利用する必要があるため、次のようにインポートするだけです。
import *module*
このパッケージを他の人と共有したいので、distutilsを使用して配布可能なパッケージに変換しました。distutilsのドキュメントの指示に従って、パッケージ内のスクリプトファイルを「setup.py」で次のように宣言しました。
setup(...,
scripts=['path/to/script/a', 'path/to/script/b']
)
このパッケージをインストールした後、distutilsがコマンドラインスクリプトのコピーをPythonインストール内の「Scripts」フォルダーにインストールしたことに気付きました。すべてうまくいっています。さて、これらのスクリプトのいずれかを実行しようとすると、次のように失敗します。
ImportError: No module named *module*
おそらくこれは、インストール後にスクリプトとモジュール間の相対パスが変更されたため、モジュールが見つからなくなったためです。だから私の質問は、同じパッケージ内のスクリプトからモジュールをインポートして、distutilsとのプレバンドルとポストインストールの両方で機能するようにするにはどうすればよいですか?
これで、モジュールのインポートを次のように変更することで、これを簡単に解決できます。
try:
import *module*
except ImportError:
from *package* import *module*
これはちょっとしたハックのようです。私はここでトリックを逃していますか?私はdistutilsが私のためにこれを処理することを期待していました。これを処理するためのより良い、より堅牢な方法はありますか?