Python import總結python
可能網上不少文章或博客都沒解釋清楚,做者本身也苦心於Python的import。至此,把本身的總結的分享給你們,本文不作基礎講解,僅說明疑惑的地方。ide
新版本的Pycharm 2017.1.1,對本身定義的模塊都有提示,寫代碼的提示(如方法,變量)。spa
import的本質,針對包和模塊來講,對於版本Python2和Python3來講,意義同樣的,僅拿Python2作實驗說明,Python3不作贅述。Python2版本Python2.7.13,Python3版本Python3.6.1.3d
導入模塊的本質是把python文件解釋和執行一遍。orm
test.py對象
#!/usr/bin/env pythonblog
# -*- coding:utf-8 -*-utf-8
# author: Changhua Gongci
print("I am test module.")get
下面在同級目錄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.
導入包的本質是執行包下的__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.
普通導入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無效。
在__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,發現也能正常運行。
導入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中卻異常報錯。
針對模塊導入,模塊中可採起__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下的對象。