网络浪子 发表于 2018-8-11 13:01:24

Python import 【总结】

  Python import总结
1   前言
  可能网上很多文章或博客都没解释清楚,作者自己也苦心于Python的import。至此,把自己的总结的分享给大家,本文不做基础讲解,仅说明疑惑的地方。
  新版本的Pycharm 2017.1.1,对自己定义的模块都有提示,写代码的提示(如方法,变量)。
2   目录

3   本质
  import的本质,针对包和模块来说,对于版本Python2和Python3来说,意义一样的,仅拿Python2做实验说明,Python3不做赘述。Python2版本Python2.7.13,Python3版本Python3.6.1.
3.1   模块
  导入模块的本质是把python文件解释和执行一遍。
  test.py
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  print("I am test module.")
  下面在同级目录TestImport.py中导入该模块:
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  import test
  执行命令:
  C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  I am test module.
3.2   包
  导入包的本质是执行包下的__init__.py文件。
  dir1/__init__.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  print("I am dir1package.")
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  import dir1
  执行命令:
  C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  I am dir1 package.
4   说明
4.1   导入模块
  普通导入import test,模块下的全部对象全部导入,这里不做说明;下面是对模块进行对象的限制导入说明。
  test.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  __all__=["A","printInfo"]
  A = "Python"
  B = "Java"
  C = "Php"
  def printInfo():
  print("I am test module.")
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  import test
  # from test import *
  print(test.A)
  print(test.B)
  print(test.C)
  test.printInfo()
  执行python:
  C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  Python
  Java
  Php
  I am test module.
  发现所有对象都导入了。
  使用from x import *导入:
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  # import test
  from test import *
  print(A)
  print(B)
  print(C)
  printInfo()
  执行命令:
  C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  Python
  Traceback (most recent call last):
  File"C:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py",line 10, in <module>
  print(B)
  NameError: name 'B' is not defined
  注释掉__all__中没有的对象,如下:
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  # import test
  from test import *
  print(A)
  # print(B)
  # print(C)
  printInfo()
  执行命令:
  C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  Python
  I am test module.
  总结:模块中__all__对对象的限制,仅对fromimport有效,对import无效。
4.2   Python2
4.2.1   导入包
  在__init__.py文件中,直接import该包下的模块。
  导入dir1包:
  dir1/__init__.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  '''
  1.这个文件在导入包时,确实会被执行;
  '''
  import test11
  import test12
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  import dir1
  dir1.test11.printInfo()
  dir1.test12.printInfo()
  执行命令:
  C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  I am test11.
  I am test12.
  在__init__.py文件中,定义__all__导入:
  导入dir1包:
  dir1/__init__.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  '''
  1.这个文件在导入包时,确实会被执行;
  '''
  __all__=["test11","test12"]
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  from dir1 import *
  test11.printInfo()
  test12.printInfo()
  执行命令:
  C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  I am test11.
  I am test12.
  Python2中用from package import*可导入package下__init__.py文件限制的模块。将解释器切换至Python3,发现也可正常执行。
  在__init__.py文件中,使用相对路径导入:
  dir1/__init__.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  '''
  1.这个文件在导入包时,确实会被执行;
  '''
  from . import test11
  from . import test12
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  import dir1
  # from dir1 import *
  dir1.test11.printInfo()
  dir1.test12.printInfo()
  或者
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  # import dir1
  from dir1 import *
  test11.printInfo()
  test12.printInfo()
  上述Python都能正常运行在Python2中,切换python解释器3,发现也能正常运行。
4.3   Python3
  导入dir1包:
  dir1/__init__.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  '''
  1.这个文件在导入包时,确实会被执行;
  '''
  import test11
  import test12
  TestImport.py文件如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import os,sys
  import dir1
  dir1.test11.printInfo()
  dir1.test12.printInfo()
  执行命令:
  C:\Python36\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  Traceback (most recent call last):
  File"C:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py",line 6, in <module>
  import dir1
  File"C:\Users\Administrator\PycharmProjects\Foundation\FuckImp\dir1\__init__.py",line 8, in <module>
  importtest11
  ModuleNotFoundError: No module named 'test11'
  总结:包中__init__.py文件中直接importmodule,调用该包时,Python2中能正常运行,Python3中却异常报错。
5   总结

[*]  针对模块导入,模块中可采取__all__限制from moduleimport *导入的对象,模块的导入Python2和Python3并没有差异,都不会抛出异常;
[*]  针对包的导入,Python2中包下__init__文件可直接import对应包下的模块,Python3不能这样导入,需使用相对路径导入(from . import module),而相对路径导入的方法对Python2和Python3都有效;
[*]  针对包的导入,Python2中包下__init__文件中使用__all__限制frompackage import *对象时,对Python2和Python3都有效;
[*]  针对从包来导包的导入,例如本例。
  下面是dir1下的__init__文件
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  '''
  1.这个文件在导入包时,确实会被执行;
  '''
  from . import test11
  from . import test12
  交互式环境
  C:\Users\Administrator\PycharmProjects\Foundation>python顶级目录
  >>> from FuckImp import dir1
  >>> dir1.test11.printInfo()# 加上包名就可调用了
  I am test11.
  在python项目中
  TestImp.py如下:
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  from FuckImp import dir1
  dir1.test11.printInfo()# 加上包名就可调用了
  运行
  C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py
  I am test11.
  Python2和Python3一样有效

[*]  当import后是package或module时,调用对应的对象时,需加上pkg.module.object或module.object, 如from x import *,可直接调用x下的对象。
页: [1]
查看完整版本: Python import 【总结】