最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python引用模塊和查找模塊路徑

 更新時間:2016年03月17日 10:27:20   作者:qingspace  
這篇文章主要介紹了Python引用模塊和Python查找模塊路徑的相關(guān)資料,需要的朋友可以參考下

模塊間相互獨立相互引用是任何一種編程語言的基礎(chǔ)能力。對于“模塊”這個詞在各種編程語言中或許是不同的,但我們可以簡單認為一個程序文件是一個模塊,文件里包含了類或者方法的定義。對于編譯型的語言,比如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解釋器要有一個查找的過程??梢酝ㄟ^設(shè)置一個環(huán)境變量PYTHONPATH為Python增加一個搜索路徑,以方便查找到相關(guān)Python模塊(不同的操作系統(tǒng)環(huán)境變量的設(shè)置稍有不同,默認以下都是WIndows環(huán)境),這與眾多應用程序需要設(shè)置一個系統(tǒng)環(huán)境變量的道理是一樣的。在命令行中可以通過以下命令設(shè)置:

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

進入Python環(huán)境后可以,通過Python的sys.path屬性獲得當前搜索路徑的配置,可以看到之前我們設(shè)置的路徑已經(jī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)提到每個.py文件都是可以認為是一個Python模塊,.py文件中可以包含類、方法、變量和常量(Python還沒有嚴格意義上的常量,只是約定大寫的變量作為常量),文件內(nèi)也可以直接寫所有的邏輯語句并在加載時從上之下直接執(zhí)行,這與其他解釋型語言是類似的。例如我們選擇在文件夾ModuleAndPackage中創(chuàng)建一個文本文件person.py文件即創(chuàng)建了一個簡單的Python模塊,其內(nèi)容如下:

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

那么接下來我們就可以在Python環(huán)境中執(zhí)行person.py。我們可以直接像執(zhí)行一個批處理文件那樣執(zhí)行person.py,在cmd命令行輸入:

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

本質(zhì)上任何一個Python應用的入口模塊都是這樣被執(zhí)行的(像C#和Java中的main函數(shù)),但是引用一個模塊,就要建立運行它的上下文環(huán)境。我們先設(shè)置一個環(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.nameThis person>>>

Python需要去某些固定的路徑下去查找Python模塊,上面我們設(shè)置在ModuleAndPackage中查找。但是這些路徑下也是有目錄層次的,Python是如何查找子目錄中的模塊呢?特別是引用第三方包時,我們也需要知道一定的層次關(guān)系。實際上,Python通過目錄和文件構(gòu)建包結(jié)構(gòu),并且包是層層嵌套的,和目錄層層嵌套是一樣的,這樣就構(gòu)成了包內(nèi)的訪問路徑(或者命名空間,也可以說Python應用的命名空間與其目錄和文件結(jié)構(gòu)是對應了,似乎缺少了一些靈活,但也更簡單)。例如我們在ModuleAndPackage文件夾下,創(chuàng)建一個文件夾animal,里面創(chuàng)建一個文本文件pet.py,其內(nèi)容如下:

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

那么如何引用pet.py這個模塊呢?按照Python的約定,需要在animal文件夾中創(chuàng)建名為__init__.py的空文本文件,以標識animal文件夾是一個包。倘若animal文件夾內(nèi)還有文件夾作為包,也必須包含__init__.py文件。這樣就層層標識了訪問的路徑。

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

或者使用from關(guān)鍵字直接導入模塊內(nèi)的屬性或方法:

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

三、Python模塊間引用

簡答來說,只要Python模塊在其執(zhí)行環(huán)境配置的搜索路徑中,并且其所在位置是包結(jié)構(gòu)的一部分,那么我們就可以引用該模塊。上文已經(jīng)提供了模塊引用的基本示例。只不過模塊間引用時import語句是寫在模塊文件中,我們修改person.py模塊的代碼。

1、from、import和as

# -*- coding: utf-8 -*-
ID = 1
name = "This person"
print name
def say(something):
print name,'says', something
from animal.pet import name as pet_name, run as pet_run
def have():
print name,'has', pet_name

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

>>> import person
This person
This pet
>>> print person.name
This person
>>> print person.pet_name
This pet
>>> person.have()
This person has This pet
>>>

2、*通配符

上面的import代碼明確了引用的變量名,但如果想引用模塊中所有變量可以使用*通配符,將上面的import語句改寫如下:

from animal.pet import * 

但這樣有可能造成變量名沖突,如下name變量發(fā)生沖突,覆蓋了person自己的name變量的值:

>>> import person
This person
This pet
>>> print person.name
This pet 

但如果想用*通配符,又不想引用模塊中的所有變量,可以在模塊中用變量__all__進行限制,修改pet.py,限制只引用ID和run兩個變量名。

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

因為沒有引用pet模塊中的name變量,person的name變量值沒有改變,run卻可以調(diào)用了。

>>> import person
This person
This pet
>>> print person.name
This person
>>> person.run("nowhere")
This pet runs nowhere
>>>

3、引用包

上面都是引用具體的animal.pet模塊,但是這對于一個相對獨立且擁有眾多的模塊的包來說就顯得麻煩了,可以直接import animal嗎?答案是肯定的,但是Python不像C#引用dll或者java引用jar那樣,引用后包內(nèi)的模塊就可以通過命名空間直接訪問了(在訪問控制許可下)。默認情況下Python還是需要導入包內(nèi)的具體模塊的,但有個變通的辦法,就是使用包中__init__.py文件,提前準備包內(nèi)需要被引用的各個模塊中的變量,類似于向外部引用者暴露包內(nèi)接口。__init__.py文件代碼是在包或者包內(nèi)模塊被引用時執(zhí)行的,因而可以在其中做一些初始化的工作。修改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 = 1
name = "This person"
print name
def say(something):
print name,'says', something
import animal
def have():
print name,'has', pet_name

在Python環(huán)境中引用person模塊,person引用animal,并自動執(zhí)行__init__的代碼加載相關(guān)變量,通過dir方法可以查看模塊中的變量,其中兩個下劃線開始的變量每個模塊都有,這些變量具有特殊的作用,是Python預定義的。

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

關(guān)于Python引用模塊和Python查找模塊路徑的相關(guān)知識,小編就給大家介紹這么多,希望對大家有所幫助!

相關(guān)文章

  • 利用python合并csv文件的方式實例

    利用python合并csv文件的方式實例

    由于項目取數(shù)需要,要將兩個不同的csv文件合并到一個文件中,所以下面這篇文章主要給大家介紹了關(guān)于利用python合并csv文件的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • pandas中數(shù)據(jù)的排序與排名的具體使用

    pandas中數(shù)據(jù)的排序與排名的具體使用

    Pandas對數(shù)據(jù)進行排序和排名是非常常見的操作,本文主要介紹了pandas中數(shù)據(jù)的排序與排名的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • pygame學習筆記(2):畫點的三種方法和動畫實例

    pygame學習筆記(2):畫點的三種方法和動畫實例

    這篇文章主要介紹了pygame學習筆記(2):畫點的三種方法和動畫實例,本文講解了單個像素(畫點)、連接多個點形成線、引用圖像、動畫完整實例,需要的朋友可以參考下
    2015-04-04
  • Python自動重新加載模塊詳解(autoreload module)

    Python自動重新加載模塊詳解(autoreload module)

    這篇文章主要介紹了Python自動重新加載模塊詳解(autoreload module),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python實現(xiàn)獲取網(wǎng)站或網(wǎng)頁的快照的示例代碼

    Python實現(xiàn)獲取網(wǎng)站或網(wǎng)頁的快照的示例代碼

    本文主要介紹了Python實現(xiàn)獲取網(wǎng)站或網(wǎng)頁的快照的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • python matplotlib實現(xiàn)雙Y軸的實例

    python matplotlib實現(xiàn)雙Y軸的實例

    今天小編就為大家分享一篇python matplotlib實現(xiàn)雙Y軸的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 淺談pandas關(guān)于查看庫或依賴庫版本的API原理

    淺談pandas關(guān)于查看庫或依賴庫版本的API原理

    本文主要介紹了淺談pandas關(guān)于查看庫或依賴庫版本的API原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Python刪除視頻的某一段并保留其他時間段

    Python刪除視頻的某一段并保留其他時間段

    moviepy是一個非常強大的視頻處理庫,可以輕松進行視頻剪切、合并、添加特效等操作,本文我們就來使用moviepy實現(xiàn)刪除視頻的某一段并保留其他時間段吧
    2024-11-11
  • Python numpy 模塊介紹

    Python numpy 模塊介紹

    這篇文章主要介紹了Python numpy 模塊,在motplotlib的學習過程中,我們使用最多的就是numpy模塊。下面我們將使用numpy進行創(chuàng)建數(shù)組、切片、索引、廣播等功能實操,需要的朋友可以參考一下
    2022-01-01
  • Python繪制分形圖案探索無限細節(jié)和奇妙之美

    Python繪制分形圖案探索無限細節(jié)和奇妙之美

    本文將介紹如何使用Python繪制各種分形圖案,包括分形樹、科赫曲線、曼德博集合等。通過本文讀者可以了解分形圖案的基本概念和構(gòu)造方法,并學會使用Python繪制出各種精美的分形圖案。本文還提供了具體的代碼示例和實踐案例,幫助讀者更好地理解分形圖案的奇妙之美
    2023-04-04

最新評論

壶关县| 思茅市| 怀柔区| 昭觉县| 耒阳市| 顺昌县| 阿荣旗| 三原县| 剑阁县| 蓬溪县| 连江县| 棋牌| 京山县| 当雄县| 郁南县| 兴山县| 三都| 邵东县| 桦川县| 聂拉木县| 郯城县| 凤翔县| 田东县| 忻州市| 河间市| 盘锦市| 同江市| 汝南县| 朝阳市| 高邑县| 安义县| 澎湖县| 宁强县| 华坪县| 棋牌| 白朗县| 临汾市| 三原县| 宁河县| 邹城市| 沂源县|