8

パスにないPythonモジュールをインポートする方法がたくさんあること知っていますが、 Pythonの__init.py__とsys.path.insertを使用してまだ出会っていません。どの方法が良いですか?パフォーマンスなど、どちらにも明らかな欠点はありますか? もう1つは「Pythonic」ですか?

私が考えることができるシナリオの 1 つは、ユーザーがダウンロードして任意のディレクトリに配置するプログラムがあるため、絶対パスがわからないということです (プログラムで取得しない限り)。フォルダ構成は

working dir
    __init__.py
    foo.py
    src/
        my_utils.py
        __init__.py

__init__.py の使用と sys.path の変更の違いはわかりません。どこで違いが生じるか考えられるシナリオはありますか?

私の質問のパート 2 は、サブディレクトリからモジュールをインポートできるようにするために何かをしなければならないのはなぜですか? 私はPythonにかなり慣れていないので、パスをいじったり、initファイルを作成したりすることがボイラープレートである理由を理解していないかもしれません。私には、それは不必要な複雑さのように思えます。現在の作業ディレクトリに "dir" があり、"import dir.my_utils" と言った場合、__init__.py にインポートできるようにしたいすべてをリストしなければならない理由がわかりません。

重複していたらすみませんが、投稿する前に検索しました。

編集:ここに別の便利なリンクがあります: __init__.py ファイルを作成せずに共通の初期化コードを自動的に呼び出す

4

1 に答える 1

6

__init__.pyは、ディレクトリをパッケージとして扱うために Python インタープリターによって使用されます。パッケージは、名前空間の競合を回避する上で重要な役割を果たします。セクション6.4 Packages from Python Modulesを読むと、共通名を持つディレクトリが検索パスの後半にある他の有効なモジュールを隠してしまうのを防ぐのに役立ちます。

したがって、パッケージ メカニズムにより、パッケージのインポート タスクが簡素化されます。an を使用することで、 fromに追加し続けると困難または面倒__init__.pyな from のようなことを行うこともできます(実際には、可能なすべてのモジュールを追加する必要があります)。package.subpackage import *sys.path

あなたの質問の2番目の部分に答えるために-ディレクトリをパッケージとして扱うために何かをする必要があるのはなぜですか-まあ、何をインポートできるようにする必要があり、何を許可してはならないかをpythonに伝える何らかの方法が必要です。また、最初に必要なモジュールをすべてインポートし、インポートする必要のあるモジュールがPYTHONPATH環境変数に既に存在する場合は、sys.path に明示的に何も追加する必要はありません。

うまくいけば、この答えがあなたの質問に光を当てます。

于 2013-07-22T04:14:06.163 に答える