我正在尝试使用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
的魔力如何运作?
答案 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库,你会发现这样的结构。它还可以包含要在导入时运行的代码,但也可以为空。