【问题标题】:Fail python import from another folder从另一个文件夹导入 python 失败
【发布时间】:2012-07-13 18:57:55
【问题描述】:

我正在尝试使用 python,主要是对其他人的代码进行故障排除。我正在尝试运行一个程序“path\folderA\program.py”。

我正在从path\folderA运行程序

我收到一个错误:

ImportError: No module named fff.ggg.ppp

program.py 包含一个导入:

from fff.ggg.ppp import mmm

在文件夹“path\folderB”中有: "path\folderB\fff\__init__.py" "path\folderB\fff\ggg"

文件夹ggg还包含__init__.py,以及程序ppp.py

通过阅读其他帖子,例如 Python error "ImportError: No module named",我了解到拥有 __init__.py 会使文件夹成为“包”,从而可以从中导入 - 但它不起作用,因为我遇到了错误。

这一直适用于参与这些项目的其他人,所以我的设置有问题。

我读到了一些关于必须在 sys.path 中的目录。这是否意味着我必须将它们添加到环境变量路径中?这意味着向 PATH 中添加很多目录,所以不可能。

所以我还发现了以下内容:

import sys
sys.path.append( <path to FolderB> )

但这意味着更改代码(其他人没有必要)并硬编码一条指向我本地机器上的路径 - 我不应该这样做,对吧?

我无法想象它 - 显然我不应该更改代码并硬编码导入模块的物理路径 - 那么来自文件夹 A 的程序怎么可能知道在文件夹 B 中查找导入?

__init__.py 的魔力如何发挥作用?

【问题讨论】:

  • Python 在PYTHONPATH 环境变量中查找,而不是PATH

标签: python import


【解决方案1】:

我无法想象它 - 显然我不应该更改代码 并硬编码导入模块的物理路径 - 那么如何 来自文件夹 A 的程序甚至知道在文件夹 B 中查找导入?

你是对的。您必须以某种方式告诉 python 在文件夹 B 中查找导入的模块。没有__init__.py 魔法可以让您从硬盘上的其他文件夹导入。

通常,如果您有各种不同的类似 python 包,它们可以通过安装到 python 的库中来工作。这样他们就可以从任何地方进口。这通常由setup.py 脚本完成。检查folderB 是否有一个。使用python setup.py install 运行它。

如果这不起作用,我们将需要有关此代码结构的更多信息。

【讨论】:

  • 谢谢,我看过setup.py,但不知道怎么用。成功了!
【解决方案2】:

文件夹 B 必须在 sys.path 上,因此您需要将 mmm 移动到 A,或者从 A 中修改 sys.path(不确定这是否有效)。 __init__.py 告诉 python 该文件夹是一个包,因此您可以在带有 __init__.py 的文件夹中拥有带有 __init__.py 的文件夹,并且 python 将其中的文件夹视为父文件夹的一部分。查看 sympy 或几乎任何大型 python 库,您会发现这样的结构。它还可以包含要在导入时运行的代码,但也可以为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2020-01-24
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2018-10-30
    相关资源
    最近更新 更多