You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:54:22