複数のモジュールを含む Python パッケージを作成しています。パッケージ内にモジュールをインポートするときに、同じ名前を持つパッケージ外のものではなく、パッケージからのみインポートしていることを確認したいと思います。
これを行う正しい方法は、相対インポートを使用することですか? パッケージを自分のマシンの別の場所に移動した場合 (または、顧客のマシンのどこにでもインストールされた場合) に干渉しますか?
複数のモジュールを含む Python パッケージを作成しています。パッケージ内にモジュールをインポートするときに、同じ名前を持つパッケージ外のものではなく、パッケージからのみインポートしていることを確認したいと思います。
これを行う正しい方法は、相対インポートを使用することですか? パッケージを自分のマシンの別の場所に移動した場合 (または、顧客のマシンのどこにでもインストールされた場合) に干渉しますか?
最新の相対インポート (参照はこちら) はパッケージ相対であり、パッケージ固有であるため、パッケージの内部構造が変更されない限り、パッケージ全体を好きな場所に移動できます。
Joran Beasleyの回答も同様に機能するはずですが(ただし、古いスタイルのインポートがパッケージのディレクトリ内で最初にチェックされるため、絶対インポートがデフォルトではない古いバージョンのPythonでは必要ないようです)、私は個人的にはあまり好きではありません特に、モジュールまたはパッケージが現在シャドーしている他のパッケージまたはモジュールの一部をロードする必要がある場合は、その必要がないときにそのようにインポートパスを変更します。
ただし、警告: これらには、問題のモジュールがパッケージの一部としてロードされているか、少なくとも__name__
パッケージ内の場所を示すためのセットが必要です。の場合、相対インポートはモジュールに対して機能しませ__name__ == '__main__'
ん。そのため、同じディレクトリ内の別のモジュールを利用する単純な/カジュアルなスクリプトを作成している場合 (スクリプトが適切なディレクトリを参照するようにしたい場合)、問題は解決しません。現在の作業ディレクトリがスクリプトに設定されていない場合は正しく動作しません)、次のようなことができます(アイデアについてhttps://stackoverflow.com/a/1432949/138772import os, sys; sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
に感謝します)。同じ質問に対するS.Lottの回答で述べたように、これはおそらくプロとして、またはチームプロジェクトの一部としてやりたいことではありませんが、単純なタスクの自動化などを行っている個人的なことでは問題ありません.
sys.path
インポートを探す場所をpythonに指示します
追加
import sys
sys.path.insert(0,".")
メインのpythonスクリプトの先頭に追加すると、組み込みパッケージの前にローカルパッケージがインポートされるようになります(ただし、これは自動的に行われると思います)
フォルダー内のパッケージのみをインポートしたい場合は、
import sys
sys.path = ["."]
ただし、おそらく多くのものを壊す可能性があるため、これはまったくお勧めしません...
ほとんどの IDE (eclipse/pycharm/etc) は、パスを含むプロジェクトが使用する環境を設定するメカニズムを提供します
本当に最善の選択肢は、システムにインストールされている組み込みパッケージまたはサードパーティ モジュールと同じ名前をパッケージに付けないことです。
また、最適なオプションは、正しくバンドルされたパッケージを介して配布することです。これで十分です。