从另一个文件夹导入失败python

时间:2012-07-13 18:57:56

标签: python import

我正在尝试使用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> )

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

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

__init__.py的魔力如何运作?

2 个答案:

答案 0 :(得分:1)

  

我无法想象它 - 显然我不应该改变代码   并硬编码导入模块的物理路径 - 所以如何才能   来自folderA的程序甚至知道在folderB中查找导入文件吗?

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

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

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

答案 1 :(得分:0)

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