Python同父目录下不同文件夹模块导入失败求助
问题:Python跨目录模块导入失败
目录结构
└── 32-PROJECT-Texas-Hold-Em-Poker/ ├── poker/ │ ├── card.py │ └── __init__.py └── tests/ └── test_cards.py └── __init__.py
尝试过的导入写法
我在test_cards.py中测试了多种导入方式:
from poker import card from .poker import card from ..poker import card from 32-PROJECT-Texas-Hold-Em-Poker.poker import card import sys sys.path.insert(1, '/path/to/Test_folder_1/Test_folder_2') from Test_folder_2 import add_numbers
遇到的问题
始终出现No module named poker或ImportError: attempted relative import with no known parent package错误。我调整过__init__.py的位置,也查阅了相对和绝对导入的资料,仍无法解决。我刚接触sys.path和venv,想知道需要学习哪些内容才能掌握这部分知识?我正在Udemy的《The complete Python bootcamp for 2022》课程学习,讲师仅通过from poker.card import Card就能成功导入,恳请帮忙。
解决方法
1. 确保运行时的工作目录正确
讲师能直接导入的核心原因,是他运行代码时的工作目录是32-PROJECT-Texas-Hold-Em-Poker/这个项目根目录。你需要:
- 打开终端,切换到
32-PROJECT-Texas-Hold-Em-Poker/文件夹下 - 用模块方式运行测试文件:
python -m tests.test_cards(-m参数会让Python识别完整的包结构)
2. 正确的导入写法
按上述方式运行后,在test_cards.py中用绝对导入即可:
from poker.card import Card
或者用相对导入(同样需要以模块方式运行):
from ..poker.card import Card
3. 临时添加路径到sys.path(不推荐长期使用)
如果不想切换工作目录,可以在test_cards.py开头添加项目根目录到Python的查找路径:
import sys from pathlib import Path # 获取项目根目录的绝对路径 root_dir = Path(__file__).parent.parent sys.path.append(str(root_dir)) from poker.card import Card
这种方式不依赖运行时的工作目录,但会破坏包结构的整洁性,仅作为临时方案使用。
需要掌握的核心内容
- Python包与模块机制:理解
__init__.py的作用(Python3.3+后可省略,但建议保留以明确包结构),区分绝对导入和相对导入的适用场景 - sys.path的工作原理:Python查找模块的路径列表规则,临时添加路径的方法,以及随意修改
sys.path的弊端 - Python代码运行方式:直接运行文件(
python tests/test_cards.py)和以模块方式运行(python -m tests.test_cards)的区别,后者会自动将当前工作目录加入sys.path并识别包层级 - 虚拟环境(venv)基础:虚拟环境不直接解决导入问题,但能隔离项目依赖、避免全局包冲突,需掌握创建、激活虚拟环境的方法,以及在虚拟环境中管理包的流程
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

