在 python3 中导入超出***包失败

Posted

技术标签:

【中文标题】在 python3 中导入超出***包失败【英文标题】:Importing beyond top-level package fails in 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 path、relative path not working even with init.py、How 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 我不同意,这对我来说似乎很正常。 那么可能会看到这个问题***.com/questions/67631/…关于如何使用importlib从绝对路径导入。 【参考方案1】:

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

【讨论】:

这就是我现在正在做的事情。但我在 *** 上的一些帖子中读到,这样做并不专业。那么还有其他想法吗? 是的,不要在代码中修改 python 路径,而是在代码之外修改环境变量:duckduckgo.com/?t=ffab&q=modify+python+path&ia=web

以上是关于在 python3 中导入超出***包失败的主要内容,如果未能解决你的问题,请参考以下文章

Web3js 在 Vue3 组合 api 项目中导入失败

无法在 Python3 中导入 gi.repository

尝试使用 boost/Python 相对导入超出***包

无法在 Swift Playground 中导入 tensorflow

有没有办法使用 SWIG C++ 创建一个 python 模块,可以在 Python2 和 Python3 中导入

在 Fusion Tables 中导入行失败