哎。差点找不到之前写的这篇笔记。
Python引用与目录结构
模块的概念
模块即单个.py文件。
模块名即文件名。
引用模块:
-
只在第一次引用时执行、且执行一次。
-
引用及使用方法:
# 仅引模块 import module m1.fun() ##使用其内变量/函数,必须使用"模块名."。否则报错 # 引模块的特定变量/函数 from module import fun fun() ##不必使用"模块名."
模块也是对象,具有一个内置属性__name__
。该属性有两种取值:模块名
、__main__
。
-
举例说明取值问题:当在A文件中引入B模块,A文件的
__name__
取值为__main__
,B模块的__name__
取值为模块名
。 -
__name__
的使用场景:在import模块时,默认情况下,模块的所有语句都会被执行一次。如果希望模块中有某些语句,在import时避免执行,可以:if __name__ == 'main': ## 这里的语句将在import时避免执行 ## 因为import时,条件为假
包的概念
包即一个文件夹。
包含了__init__.py
和一系列.py文件。包名即文件夹名。
__init__.py
是为了避免将文件夹名当作普通的字符串,其内容可以为空,一般用来进行包的某些初始化工作或者设置__all__
值,用以暴露该包的 API。
引用时搜索模块的顺序
- 当前文件所在目录
- 环境变量PYTHONPATH(包含python带的模块、自己安装的模块),可以通过bash或sys.path修改
python工程常用目录结构
-
方式一
-- src |-- mod1.py(被引用的模块) `-- test1.py(主程序)
在
test1.py
中直接import mod1
即可。 -
方式二:
-- src |-- mod1.py(被引用的模块1) |-- pkg | |-- __init__.py(必须有) | `-- mod2.py(被引用的模块2) `-- test1.py(主程序)
在
test1.py
中import mod1
在
test1.py
中from pkg import mod2
-
方式三:
-- src |-- mod1.py |-- pkg | |-- __init__.py(必须有) | `-- mod2.py |-- sub | `-- test2.py `-- test1.py
在
test1.py
中import mod1
在
test1.py
中from pkg import mod2
在
test2.py
中import sys sys.path.append("..") ## 临时加入父目录 ## 然后就可以正常地: import mod1 from pkg import mod2
在
test1.py
中from pkg import mod2