模块和包#
我们 把一个文件看做一个模块,使用 import
语句可以在其他文件中导入模块。在导入了模块后,我们就可以在之后的代码中使用模块中定义的变量和函数了。
from modules_and_packages import mymodule
mymodule.my_func()
Hey I am in mymodule.py
我们 把包含 __init__.py
文件的目录看做包,在使用 from
语句导入包中的模块时,注意到以下区别:
from package_name import *
上面这段代码表示,存在一个 package_name
的文件夹,默认情况下会导入该文件夹下的所有文件,这在 __init__.py
内容为空的时候生效。
但是,如果你定义了一个 __init__.py
中声明了下面的内容:
__all__ = ['foo', 'bar']
这表示我们只需要导入 foo
和 bar
这两个模块,忽略其他的模块。
你如果在 PyCharm 中编辑代码,很多环境问题可能不会碰到,因为 PyCharm 已经作为一个沙箱帮你部署好了。但是如果你正在使用命令行工具运行代码,比如 PowerShell,很可能会遇到下面这种报错:
ModuleNotFoundError:
这通常是因为 Python 解释器找不到 .py
文件了。这时候,你应该检查下面几个注意事项:
1、是不是在在项目的根目录下运行 python example.py
2、检查当前 Python 的搜索路径是否包含了那个找不到的 .py
文件
import sys
paths = sys.path
for path in paths:
print(path)
d:\workshop\getstarted\docs\main\python
d:\Program Files\Python311\python311.zip
d:\Program Files\Python311\DLLs
d:\Program Files\Python311\Lib
d:\Program Files\Python311
d:\Program Files\Python311\Lib\site-packages
d:\Program Files\Python311\Lib\site-packages\win32
d:\Program Files\Python311\Lib\site-packages\win32\lib
d:\Program Files\Python311\Lib\site-packages\Pythonwin
注:空字符串代表当前目录. 要加入新的搜索路径,只需要将这个路径加入到这个列表。
当查询 foo
模块时,Python 解释器会在 sys.path
列表中搜索以下文件:
定义为一个包的目录
foo
foo.so
、foomodule.so
、foomodule.sl
或foomodule.dll
(已编译扩展)foo.pyo
(只在使用-O
或-OO
选项时)foo.pyc
foo.py
除此之外,当 Python 导入一个包时,它定义了一个包含目录列表的特殊变量 __path__
,它用于查找包的模块(__path__
与 sys.path
变量的作用相似)。可以在 __init__.py
文件中访问 __path__
变量。这个列表的初始值只有一个元素,即包的目录。只要你觉得必要,一个包也可以到其他的目录中去搜索模块(在 __path__
增加要搜索的目录),换言之,一个模块可以属于一个包,却不位于这个包所在的目录或子目录下。
有两种方式可以 临时修改 Python 的搜索路径:
import os
import sys
# 加入当前目录到 sys.path
sys.path.append(os.getcwd())
# 定义搜索优先顺序,序号从 0 开始,表示最大优先级
sys.path.insert(1, os.getcwd())
# 查看修改后的 Python 搜索路径
paths = sys.path
for path in paths:
print(path)
d:\workshop\getstarted\docs\main\python
d:\workshop\getstarted\docs\main\python
d:\Program Files\Python311\python311.zip
d:\Program Files\Python311\DLLs
d:\Program Files\Python311\Lib
d:\Program Files\Python311
d:\Program Files\Python311\Lib\site-packages
d:\Program Files\Python311\Lib\site-packages\win32
d:\Program Files\Python311\Lib\site-packages\win32\lib
d:\Program Files\Python311\Lib\site-packages\Pythonwin
d:\workshop\getstarted\docs\main\python