5

我正在尝试使用 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 错误“ImportError: No module named”,我了解到__init__.py让文件夹成为“包”,这使得从中导入成为可能 - 但它不起作用,因为我收到错误。

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

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

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

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

但这意味着更改代码(对其他人来说不是必需的)并硬编码一条通往我本地机器上的路径 - 我不应该这样做,对吧?

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

魔法是如何__init__.py运作的?

4

2 回答 2

1

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

你是对的。不知何故,您必须告诉 python 在文件夹 B 中查找导入的模块。没有__init__.py魔法可以让您从硬盘驱动器上的其他文件夹导入。

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

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

于 2012-07-13T19:09:16.977 回答
0

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

于 2012-07-13T19:01:44.360 回答