Python中__init__.py未将主目录识别为包的导入问题求助
问题描述
我的文件结构如下:
soar/ __init__.py SignIn.py SignInOTP.py 90min/ __init__.py main.py
尝试在main.py中用相对导入访问上层文件的方法:
from ..SignIn import sign_in from ..SignInOTP import sign_in_otp
但出现错误:
ImportError: attempted relative import with no known parent package
用python -m '.\90min\main.py'运行时又报错:
C:\Users\path\to\python.exe: Relative module names not supported
PyCharm里soar目录没有包图标,虽然可以把文件移到90min目录临时解决,但希望SignIn.py和SignInOTP.py留在soar主目录供多子目录使用。
解决方案
1. 以模块方式正确运行脚本
相对导入要求脚本作为包的一部分被运行,不能直接执行main.py。你需要在soar目录的父目录下执行命令:
python -m soar.90min.main
这样Python会把soar识别为合法包,相对导入即可正常工作。
2. 修复PyCharm的包识别问题
PyCharm未将soar识别为包,是因为它没被标记为源码根目录:
- 右键点击
soar目录 → 选择Mark Directory as→ 点击Sources Root - 操作后
soar目录会显示包图标,PyCharm也能正确解析相对导入语法。
3. 可选:用绝对导入替代相对导入
如果不想依赖模块运行方式,可通过修改sys.path实现绝对导入。在main.py中添加以下代码:
import sys from pathlib import Path # 将soar的父目录加入Python搜索路径 sys.path.append(str(Path(__file__).parent.parent)) from SignIn import sign_in from SignInOTP import sign_in_otp
内容的提问来源于stack exchange,提问作者J. Jones
相关产品推荐
相关产品推荐

