模块和包

模块和包#

我们 把一个文件看做一个模块,使用 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']

这表示我们只需要导入 foobar 这两个模块,忽略其他的模块。

你如果在 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.sofoomodule.sofoomodule.slfoomodule.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