首页 > 技术文章 > module模块和包

ajaxa 2018-05-08 15:23 原文

import 和 from 调用

module 目录有calc.py 和  test.py 两个文件

 

calc.py文件内容:

def add(x,z):
    return x+z


def sub(x,z):
    return x-z

test.py文件调用:

import calc  #默认是同级目录下面查找
print(calc.add(1,2))


from calc import sub
print(sub(10,5))

 

导入模块按照下面方式查找
import
sys print(sys.path) ['D:\\Study\\module', 'D:\\Study','C:\\Program Files (x86)\\Python36-32\\python36.zip', 'C:\\Program Files (x86)\\Python36-32\\DLLs', 'C:\\Program Files (x86)\\Python36-32\\lib', 'C:\\Program Files (x86)\\Python36-32', 'C:\\Program Files (x86)\\Python36-32\\lib\\site-packages', 'C:\\Program Files\\JetBrains\\PyCharm 2018.1.1\\helpers\\pycharm_matplotlib_backend']

 

总结下:

  执行py文件的,执行文件的中的import 模块,只会导入当前执行文件的路劲导入文件,不会去其他目录查找(除系统提供的目录外).

  

例: 有如下一个目录结构的

        

  calc文件内容如下:

            

      test文件内容如下:

   

 

     a文件内容如下:

     

 调用:a.py 发现会报错

    

 为什么报错了? 

       a.py --> 导入 from module import test (执行module目录中test文件)   --> test 文件 import calc (报错) --> 因为当前执行的a.py文件 在当前目录找到calc(就是吧test这文件的内容拿到当前执行py里面来执行)

       我们执行a.py文件的时候,只会找当前目录的模块文件,虽然我们导入module文件中的test文件,test文件有import calc模块(import calc.py文件);但是最终还是报错,这是因为我执行的py文件的是a.py ;而test中的import calc只是一个引入文件,并不是执行文件,解释器找到这层的时候,只会按照执行文件这层目录去导入文件,所以解释器只认识a,py这层文件,这时就报错了.这就是上面总结的,反复强调 执行py文件的,执行文件的中的import 模块,解释器只会导入当前执行文件的路劲导入文件,不会去其他目录查找(除系统提供的目录外),

如何修改:

      test.py文件中的import calc 修改为 from module import calc  修改完就正常了

推荐阅读