1. 程式人生 > 程式設計 >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>python
Python 2.7.11 (v2.7.11:6d1b6a68f775,Dec 5 2015,20:32:19) [MSC v.1500 32 bit (Intel)] on win32
Type "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
['','C:\\Python\\lib\\site-packages','E:\\
Project\\Python\\ModuleAndPackage2']
>>>

二、Python中的模組和包

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

# -*- coding: utf-8 -*-
ID = 1
name = "This person"
print name
def 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>python
Python 2.7.11 (v2.7.11:6d1b6a68f775,20:32:19) [MSC v.1500 32 bit (
Intel)] on win32
Type "help","credits" or "license" for more information.
>>> import person
This person
>>> person.say("hello")
This person says hello
>>> print person.name
This person
>>>

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

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

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

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

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

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

知識點擴充套件:

使用模組有什麼好處?

當一個模組編寫完畢,就可以被其他地方引用。我們在編寫程式的時候,也經常引用其他模組,包括Python內建的模組和來自第三方的模組。

模組還可以避免函式名和變數名衝突。相同名字的函式和變數完全可以分別存在不同的模組中。但是也要注意,儘量不要與內建函式名字衝突。

如果不同的人編寫的模組名相同怎麼辦?為了避免模組名衝突,Python又引入了按目錄來組織模組的方法,稱為包(Package)。

到此這篇關於python模組如何檢視的文章就介紹到這了,更多相關python的模組在哪內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!