python模塊及外部包的導入(python從包中導入模塊)

本文目錄一覽:

python程序設計語言的程序可以導入別的模塊

可以。

importmodname。模塊是指一個可以交互使用,或者從另一Python程序訪問的代碼段。只要導入了一個模塊,就可以引用它的任何公共的函數、類或屬性。模塊可以通過這種方法來使用其它模塊的功能。用import語句導入模塊,就在當前的名稱空間(namespace)建立了一個到該模塊的引用.這種引用必須使用全稱,也就是說,當使用在被導入模塊中定義的函數時,必須包含模塊的名字。所以不能只使用funcname,而應該使用modnamefuncname。

一般情況應該使用import,但有幾個例外,1)module文檔告訴你要用from-import的。2)導入一個包組件。需要一個包裡面的某個子模塊,一般用fromA.bimportc比importA.b.c更方便,且不會冒混淆的危險。

python 類和繼承,包及模塊導入 求解答

一 .module

通常模塊為一個文件,直接使用import來導入就好了。可以作為module的文件類型有”.py”、”.pyo”、”.pyc”、”.pyd”、”.so”、”.dll”。

二. package

通常包總是一個目錄,可以使用import導入包,或者from + import來導入包中的部分模塊。包目錄下為首的一個文件便是 __init__.py。然後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。

一.模塊你可以使用import語句將一個源代碼文件作為模塊導入.例如:

[python] view plain copy

# file : spam.py

a = 37                    # 一個變數

def foo:                  # 一個函數

print “I’m foo”

class bar:                # 一個類

def grok(self):

print “I’m bar.grok”

b = bar()                 # 創建一個實例

使用import spam 語句就可以將這個文件作為模塊導入。系統在導入模塊時,要做以下三件事:

1.為源代碼文件中定義的對象創建一個名字空間,通過這個名字空間可以訪問到模塊中定義的函數及變數。

2.在新創建的名字空間里執行源代碼文件.

3.創建一個名為源代碼文件的對象,該對象引用模塊的名字空間,這樣就可以通過這個對象訪問模塊中的函數及變數,如:  

[python] view plain copy

import spam           # 導入並運行模塊 spam

print spam.a          # 訪問模塊 spam 的屬性

spam.foo()

c = spam.bar()

用逗號分割模塊名稱就可以同時導入多個模塊:

[python] view plain copy

import socket, os, regex

模塊導入時可以使用 as 關鍵字來改變模塊的引用對象名字:

[python] view plain copy

import os as system

import socket as net, thread as threads

system.chdir(“..”)

net.gethostname()

使用from語句可以將模塊中的對象直接導入到當前的名字空間. from語句不創建一個到模塊名字空間的引用對象,而是把被導入模塊的一個或多個對象直接放入當前的名字空間:

[python] view plain copy

from socket import gethostname # 將gethostname放如當前名字空間

print gethostname()            # 直接調用

socket.gethostname()           # 引發異常NameError: socket

from語句支持逗號分割的對象,也可以使用星號(*)代表模塊中除下劃線開頭的所有對象:

[python] view plain copy

from socket import gethostname, socket

from socket import *   # 載入所有對象到當前名字空間

不過,如果一個模塊如果定義有列表__all__,則from module import * 語句只能導入__all__列表中存在的對象。

[python] view plain copy

# module: foo.py

__all__ = [ ‘bar’, ‘spam’ ]     # 定義使用 `*` 可以導入的對象

另外, as 也可以和 from 聯合使用:

[python] view plain copy

from socket import gethostname as hostname

h = hostname()

import 語句可以在程序的任何位置使用,你可以在程序中多次導入同一個模塊,但模塊中的代碼*僅僅*在該模塊被首次導入時執行。後面的import語句只是簡單的創建一個到模塊名字空間的引用而已。sys.modules字典中保存著所有被導入模塊的模塊名到模塊對象的映射。這個字典用來決定是否需要使用import語句來導入一個模塊的最新拷貝.

from module import * 語句只能用於一個模塊的最頂層.*特別注意*:由於存在作用域衝突,不允許在函數中使用from 語句。 

每個模塊都擁有 __name__ 屬性,它是一個內容為模塊名字的字元串。最頂層的模塊名稱是 __main__ .命令行或是交互模式下程序都運行在__main__ 模塊內部. 利用__name__屬性,我們可以讓同一個程序在不同的場合(單獨執行或被導入)具有不同的行為,象下面這樣做:

[python] view plain copy

# 檢查是單獨執行還是被導入

if __name__ == ‘__main__’:

# Yes

statements

else:

# No (可能被作為模塊導入)

statements

模塊搜索路徑

導入模塊時,解釋器會搜索sys.path列表,這個列表中保存著一系列目錄。一個典型的sys.path 列表的值:

Linux:

[”, ‘/usr/local/lib/python2.0’,

     ‘/usr/local/lib/python2.0/plat-sunos5’,

     ‘/usr/local/lib/python2.0/lib-tk’,

     ‘/usr/local/lib/python2.0/lib-dynload’,

     ‘/usr/local/lib/python2.0/site-packages’]

Windows:

[”, ‘C:\\WINDOWS\\system32\\python24.zip’, ‘C:\\Documents and Settings\\weizhong’, ‘C:\\Python24\\DLLs’, ‘C:\\Python24\\lib’, ‘C:\\Python24\\lib\\plat-win’, ‘C:\\Python24\\lib\\lib-tk’, ‘C:\\Python24\\Lib\\site-packages\\pythonwin’, ‘C:\\Python24’, ‘C:\\Python24\\lib\\site-packages’, ‘C:\\Python24\\lib\\site-packages\\win32’, ‘C:\\Python24\\lib\\site-packages\\win32\\lib’, ‘C:\\Python24\\lib\\site-packages\\wx-2.6-msw-unicode’]

空字元串 代表當前目錄. 要加入新的搜索路徑,只需要將這個路徑加入到這個列表. 

 

模塊導入和彙編

到現在為止,本章介紹的模塊都是包含Python源代碼的文本文件. 不過模塊不限於此,可以被 import 語句導入的模塊共有以下四類: 

•使用Python寫的程序( .py文件)

•C或C++擴展(已編譯為共享庫或DLL文件)

•包(包含多個模塊)

•內建模塊(使用C編寫並已鏈接到Python解釋器內)

當查詢模塊 foo 時,解釋器按照 sys.path 列表中目錄順序來查找以下文件(目錄也是文件的一種): 

1.定義為一個包的目錄 foo

2.foo.so, foomodule.so, foomodule.sl,或 foomodule.dll (已編譯擴展)

3.foo.pyo (只在使用 -O 或 -OO 選項時)

4.foo.pyc

5.foo.py

 

對於.py文件,當一個模塊第一次被導入時,它就被彙編為位元組代碼,並將位元組碼寫入一個同名的 .pyc文件.後來的導入操作會直接讀取.pyc文件而不是.py文件.(除非.py文件的修改日期更新,這種情況會重新生成.pyc文件) 在解釋器使用 -O 選項時,擴展名為.pyo的同名文件被使用. pyo文件的內容雖去掉行號,斷言,及其他調試信息的位元組碼,體積更小,運行速度更快.如果使用-OO選項代替-O,則文檔字元串也會在創建.pyo文件時也被忽略.

如果在sys.path提供的所有路徑均查找失敗,解釋器會繼續在內建模塊中尋找,如果再次失敗,則引發 ImportError 異常. 

.pyc和.pyo文件的彙編,當且僅當import 語句執行時進行. 

當 import 語句搜索文件時,文件名是大小寫敏感的。即使在文件系統大小寫不敏感的系統上也是如此(Windows等). 這樣, import foo 只會導入文件foo.py而不會是FOO.PY.

 

重新導入模塊

如果更新了一個已經用import語句導入的模塊,內建函數reload()可以重新導入並運行更新後的模塊代碼.它需要一個模塊對象做為參數.例如: 

import foo

… some code …

reload(foo)          # 重新導入 foo

在reload()運行之後的針對模塊的操作都會使用新導入代碼,不過reload()並不會更新使用舊模塊創建的對象,因此有可能出現新舊版本對象共存的情況。 *注意* 使用C或C++編譯的模塊不能通過 reload() 函數來重新導入。記住一個原則,除非是在調試和開發過程中,否則不要使用reload()函數.

python外部包使用說明方式導入?

除了讓包內導入更加顯式,這個功能的一部分設計初衷是,為了幫助腳本解決同名文件出現在模塊搜索路徑上多個不同位置時的二義性。考慮包目錄,這定義了一個名為mypkg 的包,其中含有名為mypkg.main和mypkg.string 的模塊。現在,假設模塊main試圖導入名為string的模塊。在 Python 2.X和更早版本中,Python會先尋找mypkg目錄以執行相對導入。這會找到並導入位於該處的string.py文件,將其賦值給mypkg.main模塊命名空間內的名稱string。不過,這一導入的本意可能是要導入Python標準庫的string模塊。可惜的是,在這些Python版本中,無法直接忽略mypkg.string 去尋找位於模塊搜索路徑更右側的標準庫中的string模塊。此外,我們無法使用完整包導入路徑來解決這個問題,因為我們無法依賴在每台機器上的標準鏈接庫路徑。換句話說,包中的簡單導入可能具有二義性而且容易出錯。在包內,我們無法確定imports pam語句指的是包內的模塊還是包外的模塊。一種可能的後果是,一個局部的模塊或包會在不經意間隱藏了sys.path 上的另一個模塊。在實踐中,Python使用者可以避免為他們自己的模塊重複使用標準庫模塊的名稱(如果需要標準string庫,就不要把新的模塊命名為string)。但是,一個包還是有可能意外地隱藏標準庫模塊。再者,Python 以後可能新增標準庫模塊,而其名稱可能剛好就和自己的一個模塊同名。而依賴於沒有點號開頭相對導入的程序代碼同樣也不容易理解,因為讀者可能對希望使用哪個模塊而感到困惑。所以我們最好能在代碼中顯式地指出導入的解析過程。

Python中怎麼引入模塊

項目中想使用以前的代碼,或者什麼樣的需求致使你需要導入外部的包

如果是web 下,比如說django ,那麼你新建一個app,把你需要導入的說用東東,都寫到這個app中,然後在setting中的app也配上基本就ok了

如果是本地代碼,可以有幾種方式,

1、這種最簡單,也可能最不實用,將你的外部文件放到跟需要調用外部文件的文件同一個包下,同一目錄

folder

——toinvoke.py

——tobeinvoded.py

這樣在toinvoke.py 中引入

import toveinvoked 或 from tobeinvoked import *

即可

2、你的其他文件不是單個文件,或者不能如上所說放到同一目錄下,而是在不同目錄中,子目錄

folder

——tobeinvodedA.py

——tobeinvodedB.py

——tobeinvodedC.py

toinvoke.py

這種情況,現在folder 下新建一個__init__.py 的空文件,此時的folder不再是一個普通的文件夾,而是一個包 package,現在像這樣

folder #文件夾 現在的性質為一個python包package

——__init__.py

——tobeinvoded.py

——tobeinvodedA.py

——tobeinvodedB.py

——tobeinvodedC.py

toinvoke.py

這樣在toinvoke.py 中引入

import folder.toveinvoked 或 from folder.tobeinvoked import *

即可

3、同理,如果是如下的情況,folderB中的模塊要調用folderA中的模塊,方法同上,有什麼改變,你已經知道了

folderA

——tobeinvoded.py

——tobeinvodedA.py

——tobeinvodedB.py

——tobeinvodedC.py

folderB

——–toinvoke.py

這樣在toinvoke.py 中引入

import folder.toveinvoked 或 from folder.tobeinvoked import *

即可

4、將要被調用的代碼拷貝到$PYTHONHOME$\Lib\site-packages 下面,這個就跟Eclipse插件安裝差不多

5、在$PYTHONHOME$\Lib\site-packages 下面新建一個.pth文件,比如說是MyPackage.pth,裡面的內容是你的包的絕對路徑比如:E:/PythonPrj

那麼,在E:/PythonPrj下的所有包都可以按照包所在的相對路徑引入,這個跟Eclipse插件安裝的link 方式差不多

6、跟上面的差不多,也可以加個環境變數,這個就不多說了

總結、看看Python的包搜索路徑

Python會在以下路徑中搜索它想要尋找的模塊:

1. 程序所在的文件夾

2. 標準庫的安裝路徑

3. 操作系統環境變數PYTHONPATH所包含的路徑

將自定義庫的路徑添加到Python的庫路徑中去,有如下兩種方法:

1. 動態的添加庫路徑。在程序運行過程中修改sys.path的值,添加自己的庫路徑

import sys

sys.path.append(r’your_path’)

2. 在Python安裝目錄下的\Lib\site-packages文件夾中建立一個.pth文件,內容為自己寫的庫路徑。示例如下

E:\\work\\Python\\http

E:\\work\\Python\\logging

如何將模板文檔導入python並創建

模板文檔導入python並創建的方法如下:

1.1 需要導入的模板在同一文件夾中

比如admin.py調用test.py模板,可以在admin.py中直接執行

因為python解釋器查找模塊時會找同一文件夾,所以不用導入路徑名。

1.2 需要導入的模板在當前文件夾的子文件夾中

比如 manage.py調用setting.py模板,可以在manage.py中直接執行

無需加其他路徑說明,因為 crm 也是一個模塊(模塊的集合)。

1.3 需要導入的模板在父文件夾中

比如admin.py想調用surround.py模板(在admin.py父文件夾project下),因為解釋器找模塊只會去本文件夾及本文件夾的子文件夾去找,不會去父文件夾找,為什麼?試試看,先在admin.py中執行

當一個的模塊被導入的時候,解釋器首先尋找具有該名稱的內置模塊。如果沒有找到,然後解釋器從 sys.path 變數給出的目錄列表裡尋找該模板。所以輸出結果可以看到是一個路徑列表,其它路徑不需要看,只看第一項

說明解釋器就是從 pro文件夾開始往下找,而surround.py是在 project/crm文件夾下,顯然是找不到的。解決方法,在admin.py中執行手動把相應的路徑添加到 sys.path 中就可以了,這樣導入就相當於可以從添加的相應路徑開始往下找模塊了。可以找到,結果也不會報錯。

python導入模塊的方法有哪些

方法一

import modname

模塊是指一個可以交互使用,或者從另一Python 程序訪問的代碼段。只要導入了一個模塊,就可以引用它的任何公共的函數、類或屬性。模塊可以通過這種方法來使用其它模塊的功能。

用import語句導入模塊,就在當前的名稱空間(namespace)建立了一個到該模塊的引用.這種引用必須使用全稱,也就是說,當使用在被導入模塊中定義的函數時,必須包含模塊的名字。所以不能只使用 funcname,而應該使用 modname.funcname

方法二

from modname import funcname

from modname import fa, fb, fc

或者

from modname import *

與第1種方法的區別:funcname 被直接導入到本地名字空間去了,所以它可以直接使用,而不需要加上模塊名的限定* 表示,該模塊的所有公共對象(public objects)都被導入到 當前的名稱空間,也就是任何只要不是以」_」開始的東西都會被導入。

modname沒有被定義,所以modname.funcname這種方式不起作用。並且,如果funcname如果已經被定義,它會被新版本(該導入模塊中的版本)所替代。如果funcname被改成指向其他對象,modname不能不會覺察到。

建議:

1)如果你要經常訪問模塊的屬性和方法,且不想一遍又一遍地敲入模塊名,使用 from module import

2)如果你想要有選擇地導入某些屬性和方法,而不想要其它的,使用 from module import

3)如果模塊包含的屬性和方法與你的某個模塊同名,你必須使用import module來避免名字衝突

4)盡量少用 from module import * ,因為判定一個特殊的函數或屬性是從哪來的有些困難,並且會造成調試和重構都更困難。

方法三

內建函數__import__()

除了前面兩種使用import關鍵字的方法以外,我們還可以使用內建函數 __import__() 來導入 module。兩者的區別是,import 後面跟的必須是一個類型(type),而__import__() 的參數是一個字元串,這個字元串可能來自配置文件,也可能是某個表達式計算結果。例如:

mymodule = __import__ (』module_name』)

附註:

1)模塊的內容都放在一個模塊文件中,如 mymodule 的內容應該放在PYTHONPATH 目錄下的一個mymodule.py中,C實現的除外

2)包可以將幾個模塊名稱空間組織起來, 如A.b 就表示在包A中的一個子模塊b

可以單獨導入某一個子模塊,如Python文檔中給出的例子

import sound.effects.echo

這樣必須使用全稱對裡面的對象進行引用,如

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

還可以使用下面的語句來載入echo子模塊

from Sound.Effects import echo

它在沒有包前綴的情況下也可以使用, 所以它可以如下方式調用:

echo.echofilter(input, output, delay=0.7, atten=4)

不主張從一個包或模塊中用import * 導入所有模塊,因為這樣的通常會導致可讀性很差。

from Package import specific_submodule的用法並沒有錯,實際上這還是推薦的用法,除非導入的模塊需要使用其它包中的同名子模塊(the importing module needs to use submodules with the same name from different packages).

綜上所述,一般情況應該使用import , 但有幾個例外

1)module文檔告訴你要用from-import的

2)導入一個包組件。需要一個包裡面的某個子模塊,一般用from A.b import c比import A.b.c 更方便 且不會冒混淆的危險.

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/194397.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 14:38
下一篇 2024-12-02 14:38

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論