import can be used independently:
import module import package
It can be used to import a module, a package, or . concated module/packages.
import package.module import package1.package2 import package1.package2.module
So if you see “import xxx.yyy.zzz”, you can tell xxx,yyy are packages while zzz is either a package or a module. After importing a package/module, if you want to use a var/function/class/module in that package/module, you still need to write the package/module in front of the var/function/class/module:
import matplotlib #import pyplot //cannot use it directly:cannot find module pyplot import matplotlib.pyplot #plot(...) //plot is not defined #pyplot.plot(....) //pyplot is not defined matplotlib.pyplot.plot(...) //good
If you think it’s not convenient to write a long path, you can use “import xxx.yyy.zzz as aaa”. Then you can use aaa to replace xxx.yyy.zzz
import matplotlib.pyplot as plt plt.plot(...)
To omit even the “plt” and use functions/variables/classes directly, you should use the “from…import…” syntax.
“import…” can not be used to import a variable/function/class in a module:
To import a variable/function/class in a module, you need to use the “from… import…” statement instead:
from module import var from package.module import var from package1.package2.module import var from package1 import package2 from package1.package2 import module
In “from…import” statements, “from” can be followed by module, package, or dot concated packages/module. But “import” can only be followed by var/function/class, module, or package. “import” can not be followed by dot concated packages/module/var.
#from package1 import package2.module #from package import module.var #from package1 import package2.module.var
From the above discussion, you can see you cannot tell the name after the from keyword is a package or module, and you can not tell the name after the import keyword is a package name, a module name or a variable name, either. You just know the stuff after “from” is either a package or a module. To use a var/function/class directly without a prefix, you should write the whole dot concated name path up to the var/function/class after the from keyword, and put the name of the var/function/class after the import keyword. So if you see a name is used directly and the name is a function/variable/class based on its usage, and the name occurred after the “import” in the “from…import…” statement, you can tell the stuff after the “from” is a module or a path to a module. It is interesting that the following code does not work.
from matplotlib import pyplot #from pyplot import plot //No module named 'pyplot'
It seems that from package, we can only import module. Actually, we can import var/function/class of module from package provided that the package imports the var/function/class in its __init__.py.
#a.py from package import var print var
#__init__.py of package from module import var #import module
Consider the following situation:
#a.py from package1 import package2 #print var #print module.var print package2.var print package2.module.var
#__init__.py of package2 from module import var
Although __init__.py of package2 imports var in module and can use var directly, a.py can not use var directly. It must use package2. to access var, or use package2.module. to access var. If __init__.py changes to:
#__init__.py of package2 import module
a.py can only access var via package2.module.var.
import (whether the current script is executed by python or imported by another script) finds packages in current directory(the same directory as the script) before searching in sys.path. If the current script is imported by another script, this is equivalent to prefixing a dot before the imported package/module(the dot prefix is only valid in from…import, not in independent import):
from package import module from .package import module #import .package
The dot prefix can not be used by a script that is run by python(the main module), otherwise, you will get the following error:
ValueError: Attempted relative import in non-package
The dot-prefix form of “from…import” is called relative import. Every dot goes up one level of directory until the directory of the script run by python.