【问题标题】:Invalid relative import to parent folder对父文件夹的相对导入无效
【发布时间】:2020-07-07 10:12:39
【问题描述】:

鉴于以下文件夹结构

scripts
    __init__.py
    prepare_dot_env.py
    random_folder
        __init__.py
        index.py

scripts/random_folder/index.py 中获取导入语句from ..prepare_dot_env import prepareDotEnvBot

scripts/random_folder 内运行python index.py 时,会抛出ImportError: attempted relative import with no known parent package following exception

根据specification,假设__init__.py两个文件都是空的,这样应该没问题。这里有什么问题?

【问题讨论】:

  • 你是如何执行index.py的?您是运行文件还是使用python3 -m 开关运行模块?请注意,相对导入中的.s 不是 文件系统操作(“一个文件夹”)而是包操作(“一个包”)..
  • 都试过了,都没有成功。同样的错误,更详细的 -m 标志和更深的堆栈跟踪 @MisterMiyagi
  • 这能回答你的问题吗? How to fix 'no module named "app_one"
  • 请说明你是如何执行index.py - 例如。 python3 -m indexpython3 -m random_folder.indexpython3 -m scripts.random_folder.index?
  • 我通过 sys.path 追加操作让它工作,但由于 pep8 限制,我正在寻找重构该解决方法。 @RoshinRaphel

标签: python-3.x


【解决方案1】:

TLDR:将文件作为包的模块执行:

$ python3 -m scripts.random_folder.index

如果未安装该软件包,则必须从包含scripts/ 的文件夹或将此文件夹添加到PYTHONPATH 来完成。


相对路径通过包操作而不是文件系统操作工作。 . 表示“一个打包”,而不是“一个文件夹”。这意味着相对 . 需要有关当前包位置的信息。 The __package__ attribute contains this information:

使用此属性代替 __name__计算主要模块的显式相对导入,如 PEP 366 中所定义。预计与 __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-package

【讨论】:

  • 有趣。假设我希望它作为一个包导入。这样做缺少什么?两个目录或仅父目录的设置文件,即scripts?
  • 最终将其安装为本地软件包,因为它更适合我的需求,并且现在可以正常工作而无需将路径附加到 sys.path 。您的帮助非常宝贵。
猜你喜欢
  • 2012-12-13
  • 2021-06-02
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2018-06-11
  • 2013-01-18
  • 2016-10-05
相关资源
最近更新 更多