Issue 33340: Inaccurate docs on import
behaviour (original) (raw)
The docs https://docs.python.org/3/tutorial/modules.html#the-module-search-path describe:
When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path. sys.path is initialized from these locations:
- The directory containing the input script (or the current directory when no file is specified).
- PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
- The installation-dependent default.
However, it seems like "the directory containing the input script" is checked before the standard library:
➜ tmp more logging.py def foo(): print('bar') ➜ tmp python Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34) [GCC 7.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information.
import logging logging.foo() bar logging.WARNING Traceback (most recent call last): File "", line 1, in AttributeError: 'module' object has no attribute 'WARNING'
Am I misunderstanding the docs?
"built-in modules" has the specific meaning of modules that are compiled in to the python executable. It doesn't mean modules in the standard library.
See https://docs.python.org/3.6/library/sys.html#sys.builtin_module_names
Python 3.6.4 (default, Jan 7 2018, 15:53:53) [GCC 6.4.0] on cygwin Type "help", "copyright", "credits" or "license" for more information.
import sys sys.builtin_module_names ('_ast', '_codecs', '_collections', '_functools', '_imp', '_io', '_locale', '_operator', '_signal', '_sre', '_stat', '_string', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', 'atexit', 'builtins', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'posix', 'pwd', 'sys', 'time', 'xxsubtype', 'zipimport')