15

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? :-)

CharlesB
91.3k29 gold badges203 silver badges228 bronze badges
asked May 18, 2011 at 19:10
4
  • Btw. this is not a duplicate of stackoverflow.com/questions/4092395/… because that post has a slightly different question, and the accepted answer cannot be applied to my question. Commented May 18, 2011 at 19:13
  • You're going to have to add to your question to clarify, then; I've read these both twice, and it looks like an exact dupe to me. The accepted answer there even gives the text from the docs that you asked for. Commented May 18, 2011 at 22:06
  • 1
    @Josh Caswell: Well, Case 1 from that question does look exactly like this one, but the accepted answer doesn't really say anything about it, or it says the wrong thing. (You really have to read the whole docs to get the context; that passage appears before packages are even mentioned at all.) What does look like an applicable answer is the one from kanaka (which had no votes until I voted it up just now). It addresses the question but does not cite documentation. Commented May 18, 2011 at 22:22
  • stackoverflow.com/q/58686448/674039 Commented Nov 4, 2019 at 6:19

2 Answers 2

11

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.

answered May 18, 2011 at 19:27
Sign up to request clarification or add additional context in comments.

7 Comments

+1 for having tried, however, this doesn't prove it's a defined behaviour or luck. You might want to complete with exact platform you tried on.
You're right. I suspect that it has something to do with the way files are displayed by default when a directory listing is performed.
Thanks, I suppose that answer is good enough for me... If it turns out that this ordering is not reliable, I'll notice when bug reports start rolling in :-)
You're welcome! I'd be interested to see the results of this on Windows, but don't have ready access to a Windows machine.
This is documented at python.org/doc/essays/packages.html - see "What If I Have a Module and a Package With The Same Name?"
|
-1

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

Result

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.

answered Feb 13, 2018 at 19:05

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.