摘要:包中的一個模塊可以采用相對路徑導入包,不影響模塊功能一個腳本未成為模塊,即其目錄及父目錄內無可以采用相對路徑導入包,并以腳本模式運行。參考相對導入與絕對導入
絕對路徑導入格式為import a.b或者from a import b,相對路徑導入格式為from . import b或者from ..a import b。
python2默認為相對路徑導入,python3默認為絕對路徑導入。
為使python2,3通用,建議采用相對路徑導入from .a import b
一個目錄存在__init__.py文件,則該目錄成為一個包。
包中的一個模塊可以采用相對路徑導入包,不影響模塊功能;一個py腳本(未成為模塊,即其目錄及父目錄內無__init__.py)可以采用相對路徑導入包,并以腳本模式運行。但包含相對導入的模塊,不能直接以腳本模式運行,常見報錯為:
# python2 Traceback (most recent call last): File "module_x.py", line 1, in解決方案:from . module_y import spam as ham ValueError: Attempted relative import in non-package # python3 Traceback (most recent call last): File "module_x.py", line 1, in from . module_y import spam as ham SystemError: Parent module "" not loaded, cannot perform relative import
建立示例文件結構如下:
注:以/結尾的為文件夾。
/home/zhkai/ mobike/ __init__.py utils.py data_process/ loc.py
注意此時mobike成為一個python包。
在loc.py中導入utils.py該怎么辦?
在loc.py中導入util的方法為:
import sys sys.path.append("/home/zhkai") from mobike.utils import read_csv
需要注意,這里導入系統路徑的是mobike所在目錄的路徑,路徑本身不包含mobike。
此時utils就像自帶的python包一樣,loc.py可直接運行。
python的man page里有這個參數:
-m module-name Searches sys.path for the named module and runs the corresponding .py file as a script.
所以可以在不修改模塊代碼文件的情況下:
代碼文件仍為相對路徑:
from ..utils import read_csv
切換到mobike包同級目錄下執行:
? ~ python3 -m mobike.data_process.loc
注意:此時若loc.py代碼中有其他相對路徑,此時的相對路徑是基于shell命令所在位置,即~的,可能會造成錯誤。import語句中的相對路徑,仍是基于文件所在位置,故不影響。
推薦這種方法,因為無需修改代碼文件。
還有句話不太理解:
如果一個模塊被直接運行,則它自己為頂層模塊,不存在層次結構,所以找不到其他的相對路徑。
參考:
Python 相對導入與絕對導入
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40759.html
摘要:相對導入相對導入使用模塊的決定它是否在一個包內。當你是用類似進行相對導入的時候,點表明在包的層次中上升多少。所以,你不能在交互式會話中直接使用任何相對導入。 源題目與答案地址如下http://stackoverflow.com/questions/14132...。下面是我的翻譯(看作機翻也行),以及原文。 這個問題是如何解決在相對導入的時候,如果出現System Error的時候的解...
摘要:比如,模塊名表示包中名為的子模塊。例如,文件可以包含以下代碼定義了之后,就會把,,導入到當前命名空間。這種導入使用前導點來指示相對導入中涉及的當前包和父包。也就是說被執行的主程序里面不能包含相對導入。 包,Package,是一種Python模塊的集合,從文件組織形式上看,包就是一個文件夾,里面放著各種模塊(.py文件),也可以有子文件夾(子包)。包名構建了一個Python模塊的命名空間...
摘要:模塊與包的導入一模塊導入定義模塊,是一個文件,以結尾,包含了對象定義和語句。使用模塊還可以避免函數名和變量名沖突。特別注意的是自定義的模塊名不應該與系統內置模塊重名。包是由一系列模塊組成的集合。模塊的導入使用語句。 【Python3】Python模塊與包的導入 一、模塊導入 1. 定義 Python 模塊(Module),是一個 Python 文件,以 .py 結尾,包含了 Pytho...
摘要:所以,解決方案是強制要求從整個項目的頂層用來設置端正的路徑。這個做法是官方推薦的,也是合邏輯的,即一個完整的項目運行就應當以項目為入口來運行所有的子或子。經過不斷的實踐,發現他們大都沒說清楚上下文,甚至沒有告訴完整的解決方案。 參考Python官方:Packages?參考:Python相對導入一處不解參考:使用相對路徑名導入包中子模塊 理解Package Python里,就像所有的.p...
摘要:入門細節相除后的類型雙斜杠是整除,出來的類型是。序列,集合和字典屬于組,是的基本數據類型。變量名區分大小寫。盡量避免循環引入。變量函數等引入內指定的變量函數等。中如果沒有出現模塊名也是絕對導入。頂級包與入口文件的位置 python入門細節 相除后的類型 type(2/2) float type(2//2) int 雙斜杠是整除,出來的類型是int。單斜杠的出來的是float類型。 進制...
閱讀 847·2021-11-25 09:43
閱讀 3681·2021-11-19 09:40
閱讀 881·2021-09-29 09:34
閱讀 1783·2021-09-26 10:21
閱讀 870·2021-09-22 15:24
閱讀 4187·2021-09-22 15:08
閱讀 3265·2021-09-07 09:58
閱讀 2655·2019-08-30 15:55