项目的文件目录如下所示
project/
├── main.py
├── a/
│ ├── file1.py
│ └── file2.py
└── b/
└── file3.py
接下来我将讲解这些文件之间的调用,包括:
- main.py 调用 a/file1.py 和 b/file3.py
- a/file1.py 调用 a/file2.py(同级文件调用)
- b/file3.py 调用 a/file1.py(跨目录调用)
1. main.py 调用 a/file1.py 和 b/file3.py
在main.py
中,使用绝对导入:
# main.py
from a.file1 import func1
from b.file3 import func3
func1()
func3()
2. a/file1.py 调用同级目录的 a/file2.py
在file1.py
中,使用相对导入:
# a/file1.py
from .file2 import func2 # 相对导入
def func1():
print("Function 1 from a/file1")
func2()
或绝对导入:
# a/file1.py
from a.file2 import func2 # 绝对导入
def func1():
print("Function 1 from a/file1")
func2()
注意:若直接运行file1.py
(如python a/file1.py
),相对导入会报错attempted relative import with no known parent package
。
此时应使用绝对导入并确保项目根目录在sys.path
中
# a/file1.py
import sys
import os
# 获取当前文件所在目录的绝对路径,并找到根目录
current_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = os.path.dirname(current_dir)
sys.path.append(root_dir)
from a.file2 import func2 # 绝对导入
def func1():
print("Function 1 from a/file1")
func2()
或通过模块方式运行:python -m a.file1
3. b/file3.py 跨目录调用 a/file1.py
在file3.py
中,动态添加项目根目录到sys.path
:
# b/file3.py
import sys
import os
# 获取当前文件所在目录的绝对路径,并找到根目录
current_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = os.path.dirname(current_dir)
sys.path.append(root_dir)
from a.file1 import func1 # 绝对导入
def func3():
print("Function 3 from b/file3")
func1()
关键点总结
- 绝对导入:适用于大部分场景,但需确保项目根目录在
sys.path
中。 - 相对导入:适合包内模块间的引用,但不可直接运行子模块。
- 动态路径调整:在需要直接运行子模块时,手动添加根目录到
sys.path
。 - 模块方式运行:使用
python -m package.module
确保导入路径正确。
通过合理设置导入方式和路径,可实现跨目录、跨模块的灵活调用。