python模塊如何查看
對(duì)于編譯型的語言,比如C#中的一個(gè).cs文件,Java中的一個(gè).java或者編譯后的.class文件可以認(rèn)為是一個(gè)模塊(但常常不表述為模塊);對(duì)于解釋型的語言會(huì)更加直觀些,比如PHP的.php文件,在Python中就是.py文件可以認(rèn)為是一個(gè)模塊。在“模塊”之上有“包”,主要是為了方便組織和管理模塊。比如C#中編譯后的.dll文件(但常常不表述為包Package,而是庫Library),Java將.class打包后的.jar文件,PHP的.phar文件(模仿Java包),在Python中一個(gè)特殊定義的文件夾是一個(gè)包,可以打包為egg文件。但對(duì)于解釋型語言“包”并沒有編譯成低級(jí)語言而后打包的意思,只是更加方便模塊化和管理模塊間的依賴。每種編程語言對(duì)于模塊和包管理都有一定的約定,不了解這些約定,那會(huì)給學(xué)習(xí)這種語言的帶來障礙。下面我想來梳理一下Python的這些約定。
一、Python查找模塊的路徑
運(yùn)行Python應(yīng)用或引用Python模塊,Python解釋器要有一個(gè)查找的過程??梢酝ㄟ^設(shè)置一個(gè)環(huán)境變量PYTHONPATH為Python增加一個(gè)搜索路徑,以方便查找到相關(guān)Python模塊(不同的操作系統(tǒng)環(huán)境變量的設(shè)置稍有不同,默認(rèn)以下都是WIndows環(huán)境),這與眾多應(yīng)用程序需要設(shè)置一個(gè)系統(tǒng)環(huán)境變量的道理是一樣的。在命令行中可以通過以下命令設(shè)置:
C:\Users\Administrator>set PYTHONPATH=E:/Project/Python/ModuleAndPackage/
進(jìn)入Python環(huán)境后可以,通過Python的sys.path屬性獲得當(dāng)前搜索路徑的配置,可以看到之前我們?cè)O(shè)置的路徑已經(jīng)在當(dāng)前搜索路徑中了。
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環(huán)境中增加搜索路徑。
>>> 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中的模塊和包
前面已經(jīng)提到每個(gè).py文件都是可以認(rèn)為是一個(gè)Python模塊,.py文件中可以包含類、方法、變量和常量(Python還沒有嚴(yán)格意義上的常量,只是約定大寫的變量作為常量),文件內(nèi)也可以直接寫所有的邏輯語句并在加載時(shí)從上之下直接執(zhí)行,這與其他解釋型語言是類似的。例如我們選擇在文件夾ModuleAndPackage中創(chuàng)建一個(gè)文本文件person.py文件即創(chuàng)建了一個(gè)簡(jiǎn)單的Python模塊,其內(nèi)容如下:
# -*- coding: utf-8 -*- ID = 1 name = "This person" print name def say(something): print name,'says', something
那么接下來我們就可以在Python環(huán)境中執(zhí)行person.py。我們可以直接像執(zhí)行一個(gè)批處理文件那樣執(zhí)行person.py,在cmd命令行輸入:
Python E:/Project/Python/ModuleAndPackage/person.py
本質(zhì)上任何一個(gè)Python應(yīng)用的入口模塊都是這樣被執(zhí)行的(像C#和Java中的main函數(shù)),但是引用一個(gè)模塊,就要建立運(yùn)行它的上下文環(huán)境。我們先設(shè)置一個(gè)環(huán)境變量PYTHONPATH,以便Python解釋器找到person.py模塊,然后import person模塊,即可訪問其中的方法或變量。
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 person This person >>> person.say("hello") This person says hello >>> print person.name This person >>>
Python需要去某些固定的路徑下去查找Python模塊,上面我們?cè)O(shè)置在ModuleAndPackage中查找。但是這些路徑下也是有目錄層次的,Python是如何查找子目錄中的模塊呢?特別是引用第三方包時(shí),我們也需要知道一定的層次關(guān)系。實(shí)際上,Python通過目錄和文件構(gòu)建包結(jié)構(gòu),并且包是層層嵌套的,和目錄層層嵌套是一樣的,這樣就構(gòu)成了包內(nèi)的訪問路徑(或者命名空間,也可以說Python應(yīng)用的命名空間與其目錄和文件結(jié)構(gòu)是對(duì)應(yīng)了,似乎缺少了一些靈活,但也更簡(jiǎn)單)。例如我們?cè)贛oduleAndPackage文件夾下,創(chuàng)建一個(gè)文件夾animal,里面創(chuàng)建一個(gè)文本文件pet.py,其內(nèi)容如下:
# -*- coding: utf-8 -*- ID = 2 name = "This pet" print name def run(somewhere): print name,'runs', somewhere
那么如何引用pet.py這個(gè)模塊呢?按照Python的約定,需要在animal文件夾中創(chuàng)建名為__init__.py的空文本文件,以標(biāo)識(shí)animal文件夾是一個(gè)包。倘若animal文件夾內(nèi)還有文件夾作為包,也必須包含__init__.py文件。這樣就層層標(biāo)識(shí)了訪問的路徑。
>>> import animal.pet This pet >>> print animal.pet.name This pet >>> animal.pet.run("everywhere") This pet runs everywhere >>>
或者使用from關(guān)鍵字直接導(dǎo)入模塊內(nèi)的屬性或方法:
>>> from animal.pet import name,run >>> print name This pet >>> run("everywhere") This pet runs everywhere >>>
知識(shí)點(diǎn)擴(kuò)展:
使用模塊有什么好處?
當(dāng)一個(gè)模塊編寫完畢,就可以被其他地方引用。我們?cè)诰帉懗绦虻臅r(shí)候,也經(jīng)常引用其他模塊,包括Python內(nèi)置的模塊和來自第三方的模塊。
模塊還可以避免函數(shù)名和變量名沖突。相同名字的函數(shù)和變量完全可以分別存在不同的模塊中。但是也要注意,盡量不要與內(nèi)置函數(shù)名字沖突。
如果不同的人編寫的模塊名相同怎么辦?為了避免模塊名沖突,Python又引入了按目錄來組織模塊的方法,稱為包(Package)。
到此這篇關(guān)于python模塊如何查看的文章就介紹到這了,更多相關(guān)python的模塊在哪內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用epoll實(shí)現(xiàn)服務(wù)端的方法
今天小編就為大家分享一篇python使用epoll實(shí)現(xiàn)服務(wù)端的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10Windows10下Tensorflow2.0 安裝及環(huán)境配置教程(圖文)
這篇文章主要介紹了Windows10下Tensorflow2.0 安裝及環(huán)境配置教程(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11超簡(jiǎn)單的scrapy實(shí)現(xiàn)ip動(dòng)態(tài)代理與更換ip的方法實(shí)現(xiàn)
這篇文章主要介紹了超簡(jiǎn)單的scrapy實(shí)現(xiàn)ip動(dòng)態(tài)代理與更換ip的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03利用Python實(shí)現(xiàn)端口掃描器的全過程
這篇文章主要給大家介紹了關(guān)于如何利用Python實(shí)現(xiàn)端口掃描器的相關(guān)資料,用來檢測(cè)目標(biāo)服務(wù)器上有哪些端口開放,本文適用于有 Python和計(jì)算機(jī)網(wǎng)絡(luò)語言基礎(chǔ)的用戶,需要的朋友可以參考下2021-08-08python爬蟲中g(shù)et和post方法介紹以及cookie作用
本篇文章通過爬取163郵箱實(shí)例介紹了python爬蟲中g(shù)et和post方法介紹以及cookie作用,對(duì)此有興趣的朋友學(xué)習(xí)下。2018-02-02簡(jiǎn)單理解Python中的事件循環(huán)EventLoop
在 python 3中,加入了 asyncio 模塊,來實(shí)現(xiàn)協(xié)程,其中一個(gè)很重要的概念是事件循環(huán),本文我們就來自己實(shí)現(xiàn)一個(gè)相對(duì)簡(jiǎn)單的EventLoop,從而了解一下事件循環(huán)是如何進(jìn)行運(yùn)轉(zhuǎn)的吧2023-10-10