【问题标题】:Importing beyond top-level package fails in python3在 python3 中导入超出顶级包失败
【发布时间】:2020-10-20 11:56:28
【问题描述】:

我需要一些帮助。我已经坚持了一段时间。我不知道该怎么做。

我有一个目录“文件夹”,结构如下。

.
├── folder1
│   ├── folder3
│   │   ├── a.py
│   │   └── __init__.py
│   └── __init__.py
├── folder2
│   ├── b.py
│   └── __init__.py
└── __init__.py

我要做的基本上是将“folder2/b.py” python 文件中的一个函数导入“folder1/folder3/a.py”。我想从 "folder1/folder3/" 目录运行 'a.py' 文件。

让我用一个例子来说明这一点。假设我在 'b.py' 中有一个函数 'hello'。

def hello():
    print("Hello world!")

我还有另一个像这样的文件“a.py”。

from b import hello

def hello1():
   print("Hello World!!")

我想导航到“folder3”目录。

cd 文件夹1/文件夹3

然后运行python文件'a.py'如下。

python a.py

这样做会给我以下错误。

ValueError:尝试相对导入超出顶级包

我用谷歌搜索了一段时间,并尝试使用这些资源(Import a module from a relative pathrelative path not working even with init.pyHow to fix “Attempted relative import in non-package” even with init.py)解决这个问题。

目前唯一有效的方法是在 'a.py' 中使用 "sys.append",如下所示。但是,我读到这种用法非常不专业,非常不推荐。

import sys
sys.path.append("D:/folder")

from folder2 import b

如果您之前处理过此类设置/问题,请帮助我。谢谢!

【问题讨论】:

  • 问题是为什么你的设置看起来像这样。通常,您的项目位于根目录中,您的项目所需的任何其他包都通过 pip 安装或作为根文件夹的子级存在。因此,应该没有理由将文件夹升级。你应该把它变成一个python包。您的项目不应超出顶级文件夹。
  • 哪个操作系统?至少在 Linux 中,这通常是通过将 folder2 添加到 PYTHONPATH 环境变量来完成的。
  • @JonatanÖström 是的。但我不想使用 PYTHONPATH 方法。还有其他想法吗?
  • @TinNguyen 我不同意,这对我来说似乎很正常。
  • 那么可能会看到这个问题stackoverflow.com/questions/67631/…关于如何使用importlib从绝对路径导入。

标签: python python-3.x path


【解决方案1】:

尝试将根文件夹添加到 python 路径。

【讨论】:

  • 这就是我现在正在做的事情。但我在 StackOverflow 上的一些帖子中读到,这样做并不专业。那么还有其他想法吗?
  • 是的,不要在代码中修改 python 路径,而是在代码之外修改环境变量:duckduckgo.com/?t=ffab&q=modify+python+path&ia=web
猜你喜欢
  • 2020-11-03
  • 2017-02-22
  • 2021-03-21
  • 2020-04-06
  • 2016-05-12
  • 2018-01-27
相关资源
最近更新 更多