I wasn't clear how to correctly name this question.
Case 1
Assume that I have the following directory structure.
foo
|
+- bar/__init__.py
|
+- bar.py
If I have
from foo import bar
How do I know which bar (bar.py
or bar/__init__.py
) is being imported? Is there any easy way to automatically detect this from occurring?
Case 2
foo
|
+- foo.py
|
+- other.py
If other.py has the line
import foo
How do I know which foo (foo or foo.foo) is being imported? Again, is tehre any easy way to automatically detect this from occurring?
Packages (directories with
__init__.py
) take precedence over modules. The documentation of this fact is difficult to find but you can see this in the source: python 2.7, python 3.6 (thanks @qff for the find).You will also need a
__init__.py
within the foo directory for your example to work.If
other.py
is inside offoo/
then it will loadfoo.py
(not the directoryfoo/
) because it will look in the current directory first (unless you've played with PYTHONPATH or sys.path).TLDR; a package takes precedence over a module of the same name if they are in the same directory.
From the docs:
This is a bit misleading because the interpreter will also look for a package called
spam
(a directory calledspam
containing an__init__.py
file). Since the directory entries are sorted before searching, packages take precedence over modules with the same name if they are in the same directory becausespam
comes beforespam.py
.Note that "current directory" is relative to the main script path (the one where
__name__ == '__main__' is True
). So if you are at/home/billg
calling/foo/bar.py
, "current directory" refers to/foo
.from a python shell:
should tell you which file has been imported
Rob
in the first case you're trying to import the function bar from file 'foo.py'
In the second you're trying to import the file 'foo.py'