前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python import 【总结】

Python import 【总结】

作者头像
py3study
发布2020-01-10 11:38:25
7230
发布2020-01-10 11:38:25
举报
文章被收录于专栏:python3

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 总结

  1. 针对模块导入,模块中可采取__all__限制from moduleimport *导入的对象,模块的导入Python2和Python3并没有差异,都不会抛出异常;
  2. 针对的导入,Python2中包下__init__文件可直接import对应包下的模块,Python3不能这样导入,需使用相对路径导入(from . import module),而相对路径导入的方法对Python2和Python3都有效;
  3. 针对的导入,Python2中包下__init__文件中使用__all__限制frompackage import *对象时,对Python2和Python3都有效;
  4. 针对从包来导包的导入,例如本例。

下面是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一样有效

  1. 当import后是package或module时,调用对应的对象时,需加上pkg.module.object或module.object, 如from x import *,可直接调用x下的对象。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 前言
  • 2 目录
  • 3 本质
    • 3.1 模块
      • 3.2 包
      • 4 说明
        • 4.1 导入模块
          • 4.2 Python2
            • 4.2.1 导入包
          • 4.3 Python3
          • 5 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档