我有以下目录结构:
py_test
├── __init__.py
├── dir1
│ ├── __init__.py
│ └── script1.py
└── dir2
├── __init__.py
└── script2.py
在script2
我想"import ..script1
"。
我在script2
尝试过:
不起作用
from ..dir1 import script1 ImportError: attempted relative import with no known parent package`
工程
import sys, os path2add = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'dir1'))) if (not (path2add in sys.path)) : sys.path.append(path2add)
如果我想使用选项 1,让它工作的最简单(即文件最少(文件/目录结构是什么?我知道这一点,但我想知道是否可以避免创建该目录结构,并且仍然使用 Type-1import
.
我目前正在使用此解决方法,它使用类型 2import
.
相关:
如何导入上面目录中的 Python 类?
从上一级目录(包(导入模块
从 Python 解释器运行时获得"导入错误:尝试相对导入,没有已知的父包">
使用 importlib 动态导入包含相对导入的模块
如何在不同的 python 文件中导入变量
如注释中所述,如果script2.py
是您的入口点,则尝试导入目录的模块将不起作用。
如此链接所述,您包括:
如果模块的
__name__
不包含任何包信息(例如,它设置为__main__
(,则相对导入将解析为模块是顶级模块,而不管模块在文件系统上的实际位置如何。
模块的__name__
设置为__main__
,如果它是入口点,还是您传递给解释器的入口点,例如python script2.py
.
任何以这种方式运行的 python 模块都不再具有从更高目录导入文件所需的信息。
因此,您有两种选择:
选项 1:继续使用变通办法sys.path.append
这将按照您想要的方式工作,但它相当麻烦。
选项 2:将入口点设置为顶层
假设包有多个需要运行的脚本,则可以创建一个新文件,该文件同时导入script1
和script2
,然后根据命令行参数调用所需的功能。然后,您将能够保持当前的目录结构,并使您的相对导入正常工作,而无需摆弄sys.path
。