web-dev-qa-db-ja.com

pythonは、同じ名前のモジュールとパッケージをどのように扱いますか?

モジュールがあるとしましょうfoo.pyとパッケージfoo/。私が電話したら

import foo

どれがロードされますか?モジュールまたはパッケージをロードするために杖を指定するにはどうすればよいですか?

50
Charles Brunet

パッケージは常に読み込まれると思います。私の知る限り、これを回避することはできません。したがって、パッケージ名またはモジュール名を変更します。ドキュメント: http://docs.python.org/tutorial/modules.html#the-module-search-path

22
zeekay

実際、それは可能です(このコードは十分にテストされていませんが、機能しているようです)。

ファイルfoo.py

print "foo module loaded"

ファイルfoo/__init__.py

print "foo package loaded"

ファイルtest1.py

import foo

ファイルtest2.py

import os, imp

def import_module(dir, name):
    """ load a module (not a package) with a given name 
        from the specified directory 
    """
    for description in imp.get_suffixes():
        (suffix, mode, type) = description
        if not suffix.startswith('.py'): continue
        abs_path = os.path.join(dir, name + suffix)
        if not os.path.exists(abs_path): continue
        fh = open(abs_path)
        return imp.load_module(name, fh, abs_path, (description))

import_module('.', 'foo')

ランニング

$ python test1.py 
foo package loaded

$ python test2.py 
foo module loaded
14
abb

たぶん、あなたはあなたのクラスをfoo.pyモジュールから__init__.py

これにより、パッケージからそれらをインポートしたり、オプションのサブパッケージをインポートしたりできるようになります。

ファイルfoo/__init__.py

class Bar(object):
...

ファイルmymodule.py

from foo import Bar
from foo.subfoo import ...

それにもかかわらず、誰かがこのアプローチを再確認して、それが正しいかどうか、または__init__モジュールはそのように使用すべきではありません。

10
steppo