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? :-)
-
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.oliver– oliver2011年05月18日 19:13:17 +00:00Commented 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.jscs– jscs2011年05月18日 22:06:49 +00:00Commented 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.John Y– John Y2011年05月18日 22:22:56 +00:00Commented May 18, 2011 at 22:22
-
stackoverflow.com/q/58686448/674039wim– wim2019年11月04日 06:19:52 +00:00Commented Nov 4, 2019 at 6:19
2 Answers 2
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.
7 Comments
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.
Comments
Explore related questions
See similar questions with these tags.