Python入門之Python引用模組和尋找模組路徑

來源:互聯網
上載者:User

標籤:朋友   info   解譯器   copyright   訪問   入門   基礎   ima   令行   

#這篇文章主要介紹了Python引用模組和Python尋找模組路徑的相關資料,需要的朋友可以參考下

 

模組間相互獨立相互引用是任何一種程式設計語言的基礎能力。對於“模組”這個詞在各種程式設計語言中或許是不同的,但我們可以簡單認為一個程式檔案是一個模組,檔案裡包含了類或者方法的定義。對於編譯型的語言,比如C#中的一個.cs檔案,Java中的一個.java或者編譯後的.class檔案可以認為是一個模組(但常常不表述為模組);對於解釋型的語言會更加直觀些,比如PHP的.php檔案,在Python中就是.py檔案可以認為是一個模組。在“模組”之上有“包”,主要是為了方便組織和管理模組。比如C#中編譯後的.dll檔案(但常常不表述為包Package,而是庫Library),Java將.class打包後的.jar檔案,PHP的.phar檔案(模仿Java包),在Python中一個特殊定義的檔案夾是一個包,可以打包為egg檔案。但對於解釋型語言“包”並沒有編譯成低級語言而後打包的意思,只是更加方便模組化和管理模組間的依賴。每種程式設計語言對於模組和包管理都有一定的約定,不瞭解這些約定,那會給學習這種語言的帶來障礙。下面我想來梳理一下Python的這些約定。

 

一、Python尋找模組的路徑

運行Python應用或引用Python模組,Python解譯器要有一個尋找的過程。可以通過設定一個環境變數PYTHONPATH為Python增加一個搜尋路徑,以方便尋找到相關Python模組(不同的作業系統環境變數的設定稍有不同,預設以下都是WIndows環境),這與眾多應用程式需要設定一個系統內容變數的道理是一樣的。在命令列中可以通過以下命令設定:

 

C:\Users\Administrator>set PYTHONPATH=E:/Project/Python/ModuleAndPackage/ 

 

進入Python環境後可以,通過Python的sys.path屬性獲得當前搜尋路徑的配置,可以看到之前我們設定的路徑已經在當前搜尋路徑中了。

C:\Users\Administrator>pythonPython 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> import sys>>> sys.path[‘‘, ‘E:\\Project\\Python\\ModuleAndPackage‘, ‘C:\\Windows\\system32\\python27.zip‘, ‘C:\\Python\\DLLs‘, ‘C:\\Python\\lib‘, ‘C:\\Python\\lib\\plat-win‘, ‘C:\\Python\\lib\\lib-tk‘, ‘C:\\Python‘, ‘C:\\Python\\lib\\site-packages‘]>>>

也可以通過sys模組的append方法在Python環境中增加搜尋路徑。

>>> sys.path.append("E:\\Project\\Python\\ModuleAndPackage2")>>> sys.path[‘‘, ‘E:\\Project\\Python\\ModuleAndPackage‘, ‘C:\\Windows\\system32\\python27.zip‘, ‘C:\\Python\\DLLs‘, ‘C:\\Python\\lib‘, ‘C:\\Python\\lib\\plat-win‘, ‘C:\\Python\\lib\\lib-tk‘, ‘C:\\Python‘, ‘C:\\Python\\lib\\site-packages‘, ‘E:\\Project\\Python\\ModuleAndPackage2‘]>>>

 

二、Python中的模組和包

前面已經提到每個.py檔案都是可以認為是一個Python模組,.py檔案中可以包含類、方法、變數和常量(Python還沒有嚴格意義上的常量,只是約定大寫的變數作為常量),檔案內也可以直接寫所有的邏輯語句並在載入時從上之下直接執行,這與其他解釋型語言是類似的。例如我們選擇在檔案夾ModuleAndPackage中建立一個文字檔person.py檔案即建立了一個簡單的Python模組,其內容如下:

# -*- coding: utf-8 -*-ID = 1name = "This person"print namedef say(something):print name,‘says‘, something

那麼接下來我們就可以在Python環境中執行person.py。我們可以直接像執行一個批次檔那樣執行person.py,在cmd命令列輸入:

Python E:/Project/Python/ModuleAndPackage/person.py 

本質上任何一個Python應用的入口模組都是這樣被執行的(像C#和Java中的main函數),但是引用一個模組,就要建立運行它的上下文環境。我們先設定一個環境變數PYTHONPATH,以便Python解譯器找到person.py模組,然後import person模組,即可訪問其中的方法或變數。

C:\Users\Administrator>pythonPython 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> import personThis person>>> person.say("hello")This person says hello>>> print person.nameThis person>>>

Python需要去某些固定的路徑下去尋找Python模組,上面我們設定在ModuleAndPackage中尋找。但是這些路徑下也是有目錄層次的,Python是如何尋找子目錄中的模組呢?特別是引用第三方包時,我們也需要知道一定的層次關係。實際上,Python通過目錄和檔案構建包結構,並且包是層層嵌套的,和目錄層層嵌套是一樣的,這樣就構成了包內的訪問路徑(或者命名空間,也可以說Python應用的命名空間與其目錄和檔案結構是對應了,似乎缺少了一些靈活,但也更簡單)。例如我們在ModuleAndPackage檔案夾下,建立一個檔案夾animal,裡面建立一個文字檔pet.py,其內容如下:

# -*- coding: utf-8 -*-ID = 2name = "This pet"print namedef run(somewhere):print name,‘runs‘, somewhere

那麼如何引用pet.py這個模組呢?按照Python的約定,需要在animal檔案夾中建立名為__init__.py的空文字檔,以標識animal檔案夾是一個包。倘若animal檔案夾內還有檔案夾作為包,也必須包含__init__.py檔案。這樣就層層標識了訪問的路徑。

>>> import animal.petThis pet>>> print animal.pet.nameThis pet>>> animal.pet.run("everywhere")This pet runs everywhere>>>

或者使用from關鍵字直接匯入模組內的屬性或方法:

>>> from animal.pet import name,run>>> print nameThis pet>>> run("everywhere")This pet runs everywhere>>> 

 

三、Python模組間引用

簡答來說,只要Python模組在其執行環境配置的搜尋路徑中,並且其所在位置是包結構的一部分,那麼我們就可以引用該模組。上文已經提供了模組引用的基本樣本。只不過模組間引用時import語句是寫在模組檔案中,我們修改person.py模組的代碼。

1、from、import和as
# -*- coding: utf-8 -*-ID = 1name = "This person"print namedef say(something):print name,‘says‘, somethingfrom animal.pet import name as pet_name, run as pet_rundef have():print name,‘has‘, pet_name

import語句可以寫在文檔中的任何位置,甚至if語句中,以便更好的控制模組引用。還可以通過as語句,使用另一個變數名進行引用,以避免變數名衝突。

>>> import personThis personThis pet>>> print person.nameThis person>>> print person.pet_nameThis pet>>> person.have()This person has This pet>>>
2、*萬用字元

上面的import代碼明確了引用的變數名,但如果想引用模組中所有變數可以使用*萬用字元,將上面的import語句改寫如下:

from animal.pet import * 

但這樣有可能造成變數名衝突,如下name變數發生衝突,覆蓋了person自己的name變數的值:

>>> import personThis personThis pet>>> print person.nameThis pet 

但如果想用*萬用字元,又不想引用模組中的所有變數,可以在模組中用變數__all__進行限制,修改pet.py,限制只引用ID和run兩個變數名。

# -*- coding: utf-8 -*-__all__ = [‘ID‘,‘run‘]ID = 2name = "This pet"print namedef run(somewhere):print name,‘runs‘, somewhere

因為沒有引用pet模組中的name變數,person的name變數值沒有改變,run卻可以調用了。

>>> import personThis personThis pet>>> print person.nameThis person>>> person.run("nowhere")This pet runs nowhere>>>
  3、引用包

上面都是引用具體的animal.pet模組,但是這對於一個相對獨立且擁有眾多的模組的包來說就顯得麻煩了,可以直接import animal嗎?答案是肯定的,但是Python不像C#引用dll或者java引用jar那樣,引用後包內的模組就可以通過命名空間直接存取了(在存取控制許可下)。預設情況下Python還是需要匯入包內的具體模組的,但有個變通的辦法,就是使用包中__init__.py檔案,提前準備包內需要被引用的各個模組中的變數,類似於向外部參考者暴露包內介面。__init__.py檔案代碼是在包或者包內模組被引用時執行的,因而可以在其中做一些初始化的工作。修改animal檔案夾中__init__.py檔案如下,其中模組可以使用絕對路徑和相對路徑,相對路徑中一個句點.代表同級目錄,兩個句點..代表父目錄。

print "__init__"from pet import name as pet_name, run as pet_run#from animal.pet import name as pet_name, run as pet_run #from .pet import name as pet_name, run as pet_run 

修改person.py,直接引用anmial包:

# -*- coding: utf-8 -*-ID = 1name = "This person"print namedef say(something):print name,‘says‘, somethingimport animaldef have():print name,‘has‘, pet_name

在Python環境中引用person模組,person引用animal,並自動執行__init__的代碼載入相關變數,通過dir方法可以查看模組中的變數,其中兩個底線開始的變數每個模組都有,這些變數具有特殊的作用,是Python預定義的。

>>> import personThis person__init__This pet>>> dir(person)[‘ID‘, ‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘have‘,‘name‘, ‘pet‘, ‘pet_name‘, ‘pet_run‘, ‘say‘]>>> print person.pet_nameThis pet>>> person.pet_run("nowhere")This pet runs nowhere>>>

 

關於Python引用模組和Python尋找模組路徑的相關知識,就給大家介紹這麼多,希望對大家有所協助!

 

 

 

 

 

 

Python入門之Python引用模組和尋找模組路徑

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.