Python的from和import用法
原創菜鳥知識搬運工 最后發布於2019-06-22 11:01:38 閱讀數 9664 收藏
展開
import使一個變量名引用整個模塊對象,因此必須通過模塊名稱來得到該模塊的屬性,比如我們導入一個數學計算的模塊 math:
import math
print math.pi #導出圓周率的值
3.14159265359
我們導入math模塊,在python模塊學習中我們會知道,這樣做會得到名math的對象,這個模塊對象包含了pi這樣的常量,以及一些其它的方法。我們如果直接訪問 pi,不加math這個前綴會發生什么情況呢?
print pi
Traceback (most recent call last):
File "<pyshell#6>", line 1, in
print pi
NameError: name 'pi' is not defined
程序拋出了一個名為“NameError”的錯誤。這個時候我們可以用from這個方法來實現可以直接用pi這個方法。from會把變量名復制到另一個作用域,所以它就可以直接在腳本中使用復制后的變量名,而不用通過模塊,例如:
from math import pi
print pi
3.141592653589793
這樣我們就可以直接輸出 pi的值了,而不會報錯,不需要加那個模塊名加句號。有的朋友可能感覺還是比較麻煩,有會有更快速、更省事的Python模塊導入方法呢?還真有。
from math import *
pi
cos(pi)
3.141592653589793
-1.0
這樣就不需要一個一樣導入模塊內部的方法了,一次性的將所有python 調用函數方法導入,好處是代碼看起來非常簡潔,但是如果同時導入多個模塊,要考慮模塊方法名沖突等這些問題,至於怎么樣使用,要看你的使用環境 。
from :https://www.iplaypy.com/jinjie/from-import.html
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模塊在其執行環境配置的搜索路徑中,並且其所在位置是包結構的一部分,那么我們就可以引用該模塊。
from:https://www.cnblogs.com/qingspace/archive/2016/03/16/5284480.html
Python中在腳本中引用其他文件函數的方法
在導入文件的時候,Python只搜索當前腳本所在的目錄,加載(entry-point)入口腳本運行目錄和sys.path中包含的路徑例如包的安裝地址。所以如果要在當前腳本引用其他文件,除了將文件放在和腳本同一目錄下,還有以下幾種方法。
- 將文件所在位置添加到sys.path中
通過sys模塊的append方法在Python環境中增加搜索路徑。
import sys
sys.path.insert(0, '/path/to/application/app/folder')
sys.path.append('/path/to/application/app/folder')#2個都行
import file
./ 當前目錄。 ../ 父級目錄。 / 根目錄。
- 在文件目錄下新建__init__.py文件然后調用文件
from application.app.folder.file import func_name
init.py文件的作用
該文件的主要作用使初始化Python包。如果目錄下面包含了該文件,Python解釋器就會將該目錄當做一個包,下一步就可以使用import語句在別的.py腳本中引用該目錄下的文件。一個標准Python模塊的結構如下所示:
package/
init.py
file.py
file2.py
subpackage/
init.py
submodule1.py
submodule2.py
__init__文件可以為空但可以用來建立對包的需求。一般來說會在該文件中寫那些類,函數等需要被導入到包水平,從而可以被方便的引用。__init__文件提前准備包內需要被引用的各個模塊中的變量,類似於向外部引用者暴露包內接口。
1、如果file.py文件中有一個File類,在__init__.py文件中啥都沒寫時引用File類需要這樣操作:
from package.file import File
2、如果在__init__.py文件中將file導入包,那就在包水平可以直接引用File類:
in your init.py
from file import File
in your script
from package import File
此外,還需要注意的一點是:如果解釋器在__init__.py文件中觀察到了__all__變量,那么在運行from package import *時就只會引入__all__變量中列出的那些模塊。例如:如果想在上述結構的只引入submodule1模塊,那么可以在subpackage/init.py文件中定義__all__ = ['submodule1'],當引用subpackage時from subpackage import *就只引入了submodule1模塊。
————————————————
版權聲明:本文為CSDN博主「菜鳥知識搬運工」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_30815237/article/details/93203934