python相對導入
⑴ python導入py文件報錯怎麼辦
其實這兩個錯誤的原因歸根結底是一樣的:在涉及到相對導入時,package所對應的文件夾必須正確的被python解釋器視作package,而不是普通文件夾。否則由於不被視作package,無法利用package之間的嵌套關系實現python中包的相對導入。
文件夾被python解釋器視作package需要滿足兩個條件:
1、文件夾中必須有__init__.py文件,該文件可以為空,但必須存在該文件。
2、不能作為頂層模塊來執行該文件夾中的py文件(即不能作為主函數的入口)。
補充:在"from YY import XX"這樣的代碼中,無論是XX還是YY,只要被python解釋器視作package,就會首先調用該package的__init__.py文件。如果都是package,則調用順序是YY,XX。
另外,練習中「from . import XXX」和「from .. import XXX」中的'.'和'..',可以等同於linux里的shell中'.'和'..'的作用,表示當前工作目錄的package和上一級的package。
⑵ python 導入模塊問題
導入模塊是會執行一遍的
如果不想在導入模塊時執行某部分代碼,
需要將那部分代碼到
if __name__=='__main__': 裡面,
那部分代碼只會在當他是作為主文件運行時才會跑
⑶ 求助一個關於python3.4的相對包導入問題,很初級
關於 from .. import 是如下說明的:
From…import 語句
Python的from語句讓你從模塊中導入一個指定的部分到當前命名空間中。語法如下:
from modname import name1[, name2[, ... nameN]]
例如,要導入模塊fib的fibonacci函數,使用如下語句:
from fib import fibonacci
這個聲明不會把整個fib模塊導入到當前的命名空間中,它只會將fib里的fibonacci單個引入到執行這個聲明的模塊的全局符號表。
From…import* 語句
把一個模塊的所有內容全都導入到當前的命名空間也是可行的,只需使用如下聲明:
from modname import *
這提供了一個簡單的方法來導入一個模塊中的所有項目。然而這種聲明不該被過多地使用。
所以感覺你應當是用from b import * 和 from a import * 或者直接 import a,b
⑷ Python2.7中的相對導入有哪些問題,引入absolute
關於 from .. import 是如下說明的:From…import 語句Python的from語句讓你從模塊中導入一個指定的部分到當前命名空間中。語法如下:from modname import name1[, name2[, ... nameN]]例如,要導入模塊fib的fibonacci函數,使用如下語句:from fib import fibonacci這個聲明不會把整個fib模塊導入到當前的命名空間中,它只會將fib里的fibonacci單個引入到執行這個聲明的模塊的全局符號表。From…import* 語句把一個模塊的所有內容全都導入到當前的命名空間也是可行的,只需使用如下聲明:from modname import *這提供了一個簡單的方法來導入一個模塊中的所有項目。然而這種聲明不該被過多地使用。 所以感覺你應當是用from b import * 和 from a import * 或者直接 import a,b
⑸ 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 導入模塊
在文件夾a的下面,新建一個__init__.py的py文件,
然後添加ab文件路徑為系統路徑:sys.path.append(ab文件路徑)
最後利用:from a import a即可。
⑺ 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 以後可能新增標准庫模塊,而其名稱可能剛好就和自己的一個模塊同名。而依賴於沒有點號開頭相對導入的程序代碼同樣也不容易理解,因為讀者可能對希望使用哪個模塊而感到困惑。所以我們最好能在代碼中顯式地指出導入的解析過程。
⑻ 如何在python3中正確導入同一目錄下的模塊
因為要absolute_import,這樣import webchat_sdk.basic應該沒問題了。
在 Python 2 裡面可以使用 import foo來導入相同目錄包下的模塊foo,在 Python 3 裡面就是導入的項目根目錄(最上層有__init__.py的目錄)包foo。 也就是說 Python 3 默認就是絕對導入的,import .foo只是相對於絕對導入來說的,並不是相對導入。
⑼ python包相對導入的陷阱是
包相對導入的陷阱:混合使用,相比於Python 2.X的隱式包相對導入,以及Python 2.X和3.X中的顯式包相對導入點號語法,有些時候從 sys.path上一個路徑出發的絕對包導入會是更推薦的選擇。這一問題可能看上去難以理解,但是當你開始編寫自己的包,可能就會變得更加重要了。 如前所述,Python 3.X的相對導入語法和默認絕對導入搜索規則,讓包內導入變得顯式從而使其更容易被注意和被維護,而且允許你在一些命名沖突的情況下顯式地進行選擇。然而,你也必須注意到該模型帶來的下面兩個結果:在Python 3.X和2.X中,包相對導入語句的使用會隱式地將一個文件與一個包目錄的角色進行綁定,並禁止該文件通過其他方式被使用。在Python 3.X中,新的相對導入搜索規則改變意味著一個文件不能像在2.X中那樣同時扮演腳本和包模塊的角色。這些約束的理由有些微妙,不過由於下面的兩條同時成立:Python 3.X和2.X不允許隨意使用from .的相對導入語法,除非發起導入的文件本身作為包的一部分(即該文件在其他地方被導入)。Python 3.X的導入不會搜索一個包模塊自身的路徑,除非使用了from .的相對導入語法(或該模塊位於當前工作路徑、頂層腳本的主目錄下)。使用相對導入會阻止你在2.X和3.X中創建同時扮演可執行程序和外部可導入包角色的目錄項。此外,一些文件在3.X中不能像在2.X中那樣同時扮演腳本和包模塊的角色。就導人語句來說,這些規則可以歸結為下面的兩行代碼的形式:前一行在Python 2.X和3.X中都只用於包模式,而後一行在3.X中只用於程序模式。
最終的效果是不論2.X還是3.X中的文件,你都應該只選擇一種使用模式,即包模式(使用相對導入)或程序模式(使用簡單導入),並將真正的包模塊文件單獨放到一個子目錄中,與頂層腳本文件隔離開來。
另一方面,你可以嘗試手動改變sys.path(通常是一項脆弱並易出錯的任務)或總是通過絕對導入使用完整的包路徑,並且假定包的根目錄位於模塊搜索路徑上,來替代包相對導入語法或簡單導入。