大家好,今天又研究了下模块与模块之间的调用,很多情况下,我们会遇到跨模块的调用,那么如何更好的来调用呢?接下来就跟大家一起来探讨下:
情景一:(test包下面包含两个模块,分别是test-1和test-2)
test
->__init__.py
->test-1.py
->test-2.py
test-2中有如下的方法和变量
name='tom'
def run():
print('running')
在这种情景下,test-1想调用test-2中的属性或方法时应该怎么做?见如下
import test-2
print(test-2.name)---->输出:tom
print(test-2.run())---->输出running
所以导入模块的本质就是把python文件解释一遍
情景二:(test-2模块是和test包同级,都位于python包下面)
python
test
->__init__.py
->test-1.py
test-2.py
其中test-1中有如下代码:
name='test-1'
def walk()
print('walking')
在这种情况下test-2想调用test-1的属性和方法该怎么办?
test-2想调test-1中的属性和方法
在__init__模块中
from . import test-1
在test-2模块中
import test--->这是在test-2中导入包test--->这里导入的也是包,不是模块
print(test.test-2.name)或者
test.test-2.walk()
分别输出test-1和walking
所以,导入包其实就是执行包里的__init__.py文件,那执行__init__文件时,只要在init文件中调用test-1模块,那test-2就能调用到test-1的属性和方法
情景三:(test包中的test-1模块想调用test-2中的属性和方法)
python
test
->__init__.py
->test-1.py
test-2.py
其中test-2中有如下代码:
name='test-2'
def walk()
print('walking-test-2')
这种情况,因为test包和test-2模块都是属性python这个包下面的,所以那就需要把test所在的包加到环境变量中,那在搜索时test包和test-2模块都能找到
import os,sys
x=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,x)
import test-2--->这里导入的是包,这是重点
print(test-2.name)或者
test-2.walk()
分别输出test-2和walking-test-2
情景四:(test和test-x包中分别带有一个模块)
python
test
->__init__.py
->test-1.py
test_x
->__init__.py
->test-2.py
其中test-1中有如下代码:
name='test-1'
def walk()
print('walking-test-1')
其中test-2中有如下代码:
name='test-2'
def walk()
print('walking-test-2')
如果跨包去掉另一个模块呢?其实方法一样,加入test-2想调test-1中的属性和方法
这是在test-2模块中写的代码:
import os,sys
x=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,x)
import test----->注意这里是导入包(这是关键,不是模块哦)
print(test.test-1.name)或者
test.test-1.walk()
同时因为是调包里的模块的原因,所以,其实是执行__init__文件里的内容
所以在init模块中需要导入test-1模块
from . import test-1
--->这时候就输出test-1和walking-test-1
综上:
假如某个模块想调用另一个模块中的属性和方法,调方必须和被调方在同一个目录或者说在同一个路径下
但是,如果是模块和包在同一个目录下的这种情况,模块调包中的模块时,主要是执行init文件,需要把同级目录的模块导入到init文件中,来使得另一个模块在执行init文件时,可以调用。