给定以下文件夹结构
scripts
__init__.py
prepare_dot_env.py
random_folder
__init__.py
index.py以from ..prepare_dot_env import prepareDotEnvBot中的scripts/random_folder/index.py导入语句为例。
当在python index.py中运行scripts/random_folder时,会抛出ImportError: attempted relative import with no known parent package following exception。
根据规格说明,假设两个__init__.py文件都是空的,这应该是可以的。这里的陷阱是什么?
发布于 2020-07-07 10:28:35
TLDR:将文件作为包的一个模块执行:
$ python3 -m scripts.random_folder.index如果没有安装包,则必须从包含scripts/的文件夹或通过将此文件夹添加到PYTHONPATH来完成。
相对路径通过包操作工作,而不是文件系统操作。.的意思是“一个包向上”,而不是“一个文件夹向上”。这意味着相对.需要有关当前包位置的信息。属性包含以下信息:
该属性用于计算主要模块的显式相对导入(如PEP 366中定义的),而不是
__name__。预期它具有与__spec__.parent相同的值。
所需信息由合格导入设置,包括-m标志:
$ # script content: package metadata and import
$ cat scripts/random_folder/index.py
print(__package__)
print(__name__)
from ..prepare_dot_env import bar
print(bar)
$ # script as package member
$ python3 -m scripts.random_folder.index
scripts.random_folder
__main__
Placeholder to demonstrate import
$ # script as standalone executable
$ python scripts/random_folder/index.py
None
__main__
Traceback (most recent call last):
File "scripts/random_folder/index.py", line 3, in <module>
from ..prepare_dot_env import bar
ValueError: Attempted relative import in non-packagehttps://stackoverflow.com/questions/62772923
复制相似问题