Python的from和import用法


一、使用 from import方法導入Python模塊

import使一個變量名引用整個模塊對象,因此必須通過模塊名稱來得到該模塊的屬性,比如我們導入一個數學計算的模塊 math:

 我們導入math模塊,這樣做會得到名math的對象,這個模塊對象包含了pi這樣的常量,以及一些其它的方法。我們如果直接訪問 pi,不加math這個前綴會發生什么情況呢?

程序拋出了一個錯誤。這個時候我們可以用from這個方法來實現可以直接用pi這個方法。from會把變量名復制到另一個作用域,所以它就可以直接在腳本中使用復制后的變量名,而不用通過模塊,例如:

 這樣我們就可以直接輸出 pi的值了,而不會報錯,不需要加那個模塊名加句號。有的朋友可能感覺還是比較麻煩,有會有更快速、更省事的Python模塊導入方法呢?

 這樣就不需要一個一樣導入模塊內部的方法了,一次性的將所有python 調用函數方法導入,好處是代碼看起來非常簡潔,但是如果同時導入多個模塊,要考慮模塊方法名沖突等這些問題,至於怎么樣使用,要看你的使用環境 。

from語句有破壞命名空間的潛質。如果使用from導入變量,變量碰巧和作用域中現有變量重名,變量就會被悄悄的覆蓋掉。
使用import語句時就不存在這種問題,因為必須通過模塊名才能獲取其內容。不過,使用from時,只要你了解並預料到可能發生這種事,在實際情況下這就不是一個大問題了,尤其是當你明確列出導入變量名時(例如,from module import x, y, z)。
另一方面,from module import *形式的確可能破壞命名空間,讓變量名難以理解,尤其是在導入一個以上的文件時。
比較務實的建議是:簡單的模塊一般傾向於使用import,而不是from。多數的from語句是用於明確列舉想要的變量,而且限制在每個文件中只用一次from *形式。這樣一來,任何無定義的變量名都可以認為是存在於from *所引用的模塊內。當你必須使用兩個不同模塊內定義的相同變量名變量時,才真的必須使用import,這種情況下不能使用from。

二、Python中的模塊和包

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

Python需要去某些固定的路徑下去查找Python模塊,上面我們設置在ModuleAndPackage中查找。但是這些路徑下也是有目錄層次的,Python是如何查找子目錄中的模塊呢?特別是引用第三方包時,我們也需要知道一定的層次關系。實際上,Python通過目錄和文件構建包結構,並且包是層層嵌套的,這樣就構成了包內的訪問路徑。例如我們在ModuleAndPackage文件夾下,創建一個文件夾animal,里面創建一個文本文件pet.py。

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

簡答來說,只要Python模塊在其執行環境配置的搜索路徑中,並且其所在位置是包結構的一部分,那么我們就可以引用該模塊。

三、Python中在腳本中引用其他文件函數的方法

在導入文件的時候,Python只搜索當前腳本所在的目錄,加載(entry-point)入口腳本運行目錄和sys.path中包含的路徑例如包的安裝地址。所以如果要在當前腳本引用其他文件,除了將文件放在和腳本同一目錄下,還有以下幾種方法,

1. 將文件所在位置添加到sys.path中

2. 在文件目錄下新建__init__.py文件然后調用文件

init.py文件

a).init.py文件的作用
該文件的主要作用使初始化Python包。如果目錄下面包含了該文件,Python解釋器就會將該目錄當做一個包,下一步就可以使用import語句在別的.py腳本中引用該目錄下的文件。一個標准Python模塊的結構如下所示:

package/
    __init__.py
    file.py
    file2.py
    subpackage/
        __init__.py
        submodule1.py
        submodule2.py

b). init__文件可以為空但可以用來建立對包的需求。一般來說會在該文件中寫那些類,函數等需要被導入到包水平,從而可以被方便的引用。比如:如果file.py文件中有一個File類,在__init.py文件中啥都沒寫時引用File類需要這樣操作:

如果在__init__.py文件中將file導入包,那就在包水平可以直接引用File類:

此外,還需要注意的一點是__init__.py文件中的all變量。如果解釋器在__init__.py文件中觀察到了__all__變量,那么在運行from package import *時就只會引入__all__變量中列出的那些模塊。例如:如果想在上述結構的只引入submodule1模塊,那么可以在subpackage/__init__.py文件中定義__all__ = ['submodule1'],當引用subpackage時from subpackage import *就只引入了submodule1模塊。

3. 將文件所在目錄添加到python的環境變量

export PYTHONPATH=$HOME/pathToYourScripts/:$PYTHONPATH


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM