Reputation: 153
Suppose in the current directory there is a file named somecode.py
, and a directory named somecode
which contains an __init__.py
file. Now I run some other Python script from this directory which executes import somecode
. Which file will be imported - somecode.py
or somecode/__init__.py
?
Is there even a defined and reliable search order in which this is resolved?
Oh, and does anyone have a reference to official documentation for this behavior? :-)
Upvotes: 15
Views: 566
Reputation: 5350
tested in Windows 10 (Python version 3.5) and on Ubuntu Linux (Python version 2.7 and 3.5) using the following directory:
https://github.com/alphaCTzo7G/stackexchange/tree/master/python/order_import_module_vs_package
The module is always loaded and the following message is printed out every time:
"you have imported foo/init.py"
So it seems to be consistent across these Systems, that the package is loaded first.
Upvotes: -1
Reputation: 33716
Packages will be imported before modules. Illustrated:
% tree .
.
|-- foo
| |-- __init__.py
| `-- __init__.pyc
`-- foo.py
foo.py
:
% cat foo.py
print 'you have imported foo.py'
foo/__init__.py
:
% cat foo/__init__.py
print 'you have imported foo/__init__.py'
And from interactive interpreter:
>>> import foo
you have imported foo/__init__.py
I have no idea where this is officially documented.
Edit per comment: This was performed with Python 2.7 on Mac OS X 10.6.7. I also performed this using Python 2.6.5 on Ubuntu 10.10 and experienced the same result.
Upvotes: 11