我对python没有经验,所以如果我的话有任何错误,请告诉我。如果您的文件层次结构是这样排列的:
project\
module_1.py
module_2.py
module_1.py 定义了一个名为func_1() 的函数,module_2.py:
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
并且您在 cmd 中运行 python module_2.py,它会运行 func_1() 定义的内容。这通常是我们导入相同层次结构文件的方式。但是当你在module_2.py 中写from .module_1 import func_1 时,python 解释器会说No module named '__main__.module_1'; '__main__' is not a package。因此,为了解决这个问题,我们只需保留刚刚所做的更改,并将两个模块都移动到一个包中,并让第三个模块作为调用者来运行module_2.py。
project\
package_1\
module_1.py
module_2.py
main.py
main.py:
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
但是我们在module_2.py 中的module_1 之前添加. 的原因是,如果我们不这样做并运行main.py,python 解释器会说No module named 'module_1',这有点棘手,@987654338 @就在module_2.py旁边。现在我让func_1() in module_1.py 做点什么:
def func_1():
print(__name__)
__name__ 记录谁调用了 func_1。现在我们将. 保留在module_1 之前,运行main.py,它将打印package_1.module_1,而不是module_1。它表示调用func_1() 的人与main.py 处于同一层次,. 暗示module_1 与module_2.py 本身处于同一层次。因此,如果没有点,main.py 将在与其自身相同的层次结构中识别module_1,它可以识别package_1,但不能识别它“下”的内容。
现在让我们让它变得有点复杂。你有一个config.ini 并且一个模块定义了一个函数来读取它与'main.py'相同的层次结构。
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
而且由于一些不可避免的原因,你必须用module_2.py 调用它,所以它必须从上层导入。module_2.py:
import ..config
pass
两个点表示从上层导入(三个点访问上层比上层,依此类推)。现在我们运行main.py,解释器会说:ValueError:attempted relative import beyond top-level package。这里的“顶级包”是main.py。正因为config.py在main.py旁边,他们处于同一层次,config.py不在main.py“下”,或者不是main.py“领导”,所以它在main.py之外.要解决这个问题,最简单的方法是:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
我觉得这和项目文件层次排列的原则是不谋而合的,你应该把不同功能的模块放在不同的文件夹里,在外面留一个top caller,你想怎么导入就怎么导入。