Python import 【總結】

Python import總結python

1     前言

可能網上不少文章或博客都沒解釋清楚,做者本身也苦心於Pythonimport。至此,把本身的總結的分享給你們,本文不作基礎講解,僅說明疑惑的地方。ide

新版本的Pycharm 2017.1.1,對本身定義的模塊都有提示,寫代碼的提示(如方法,變量)。spa

2     目錄

wKioL1kEHmnBFJV3AAANxCJCu4c831.png-wh_50

3     本質

import的本質,針對包和模塊來講,對於版本Python2Python3來講,意義同樣的,僅拿Python2作實驗說明,Python3不作贅述。Python2版本Python2.7.13Python3版本Python3.6.1.3d

3.1   模塊

導入模塊的本質是把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.

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 *導入的對象,模塊的導入Python2Python3並無差別,都不會拋出異常;

  2. 針對的導入,Python2中包下__init__文件可直接import對應包下的模塊,Python3不能這樣導入,需使用相對路徑導入(from . import module),而相對路徑導入的方法對Python2Python3都有效;

  3. 針對的導入,Python2中包下__init__文件中使用__all__限制frompackage import *對象時,對Python2Python3都有效;

  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.

Python2Python3同樣有效

  1. import後是packagemodule時,調用對應的對象時,需加上pkg.module.objectmodule.object, from x import *,可直接調用x下的對象。

相關文章
相關標籤/搜索