在Python中,我们可以使用import
语句导入一个py文件中的函数、类等组件。当我们把程序拆分成多个py文件去编写时,就会遇到各个文件之间相互导入的问题。下面我来详细介绍Python中关于py文件之间相互import的问题及解决方法。
导入方式
在Python中,有三种导入方式:
相对导入
相对导入是指从当前目录导入模块。使用相对导入必须在目录下面,否则会出错。相对导入用“.”来表示。
from . import module_name
绝对导入
指从python安装的路径或者python的搜索路径中导入模块。绝对导入以“、”开头。绝对导入的好处在于可以避免名字重复的问题。
import package.module_name
动态导入
就是通过字符串形式把模块导入进来。通过字符串把模块导入进来有时候更加方便。
import importlib
module_name = 'module_xxx'
module = importlib.import_module(module_name)
py文件之间相互导入的问题
在程序中如果两个或者多个py文件相互导入,如果不适当的使用相对导入,就会出现以下两种问题:
- 导入错乱:相互导入可能导致两个模块之间的导入顺序出现问题,从而导致名称未定义的错误。
- 死循环:如果两个模块彼此导入,可能会导致两个模块陷入无限循环中,导致程序崩溃。
解决方法
为了避免出现上述问题,我们可以在导入其他模块之前,先确定当前文件所在的包的位置。并以此为基础,使用相对导入方式。
比如我们有两个py文件,分别为:
- package1/module1.py
- package2/module2.py
module1.py中需要导入module2.py中的函数fun()。
# package1/module1.py
from ..package2 import module2
module2.fun()
# package2/module2.py
def fun():
pass
在使用相对路径导入时,需要注意导入的路径与当前文件所在路径的关系,否则可能会导致找不到模块的错误。
示例说明
我们再来看一下另一个例子。
- script1.py
- module1.py
- module2.py
module1.py中定义了一个函数hello()
, module2.py中使用了module1.py中的hello()
函数。script1.py中需要调用module2.py中的函数。
# module1.py
def hello():
print("Hello, world!")
# module2.py
from . import module1
def greet():
module1.hello()
# script1.py
from package2.module2 import greet
greet()
在上面的代码中,script1.py中通过绝对路径导入greet()函数,然后greet()函数中通过相对路径导入module1.py中的hello()函数。这样可以避免名称空间的冲突,同时也保证了导入的正确性。
总的来说,要避免死循环,需要在程序中尽量使用相对路径来导入模块,同时要保证导入的路径正确、文件名正确。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中关于py文件之间相互import的问题及解决方法 - Python技术站