Python从兄弟文件夹导入模块

3

我正在尝试从一个兄弟文件夹中导入一个模块,该模块是一个Python文件。我阅读了几个类似的问题,并尝试应用那里列出的解决方案,但我没有能够解决问题。

目录结构如下:

parentfolder/gfolder/codefolder/fileA.py
parentfolder/gfolder/utilfolder/util.py
、和都有一个<__init__.py>文件。

我正在尝试在中执行以下操作:

import gfolder.utilfolder.util as util

我也尝试在导入语句之前添加以下内容:
sys.path.append(".../parentfolder/")

但这也不起作用:

import gfolder.utilfolder.util as util
ModuleNotFoundError: No module named 'gfolder'

类似问题的解决方案中,建议在目录中包含__init.py__文件,我已经做到了。

编辑: 现在sys.appendsys.insert都可以使用,问题是我在路径末尾添加了一个斜杠。当我去掉它时,一切正常了。


2个回答

3
首先,让我向您描述一下Python模块和Python包之间的区别,以便我们彼此理解。✌

模块是一个单独的.py文件(或多个文件),它们在一个导入下被导入并使用。✔

import aModuleName # 这里的'aModuleName'只是一个常规的.py文件。

相反,包是一个目录中的模块集合,它们给出了一个包层次结构。 包含一个独特的__init__.py文件。✔

from aPackageName import aModuleName # 这里的'aPackageName`是一个带有`__init__.py`文件的文件夹 # 和'aModuleName',这只是一个常规的.py文件。


因此,当我们有一个名为proj-dir的项目目录,其结构如下⤵

proj-dir --|--__init__.py --package1 --|--__init__.py --|--module1.py --package2 --|--__init__.py --|--module2.py

请注意,我还在proj-dir本身中添加了一个空的__init__.py,这也使它成为了一个包。

现在,如果您想要从package2module2中导入任何Python对象到package1module1中,那么文件module1.py中的import语句将是

from proj-dir.package2.module2 import object2 # 如果您要导入整个module2,则为 from proj-dir.package2 import module2

我希望这个简单的解释能够澄清你对Python导入机制的疑惑。


1
嗨@Sushant Chaudhary,我有一个问题,如果脚本从package1 module1运行,它会起作用吗?我正在尝试它,但在我看来,Python的导入只能从所有导入的文件中调用才能生效。例如,在这个例子中,如果我的entry point是main.py,则需要在Proj-dir中拥有一个main.py才能使所有导入都起作用,但如果我直接运行package2 module2,我会得到"ValueError: attempted relative import beyond top-level package"。这就是它的工作原理吗? - Remigius Kalimba Jr
1
实际上并不是这样的,你的父级包不会自动出现在sys.path中。更多信息请参见此处:https://dev59.com/Im015IYBdhLWcg3w6QA0#50193944 - Azamat Galimzhanov
2
如果您直接调用脚本(模块),那么这个答案不起作用,您必须使用python -m project.package1.module1 - Levi Lesches
使用相同的布局,会引发“ModuleNotFoundError: No module named proj-dir”错误。 - scrollout

1

在下面的线程中,安德鲁·考克斯回答了从相对路径导入模块的问题。

您可以将子目录添加到Python路径中,以使其像普通脚本一样导入。

import sys
sys.path.insert(0, <path to gfolder>)
import gfolder

你也可以将该目录添加到Linux系统的PATH变量中(我会在项目工作时使用它,最后我将PATH修改回原始值)。

如果保持以下结构,则可以轻松使用它。

parentfolder/gfolder/codefolder/fileA.py
parentfolder/gfolder/utilfolder/util.py
parentfolder/gfolder/main.py

运行 main.py


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接