摘要:包中的一個(gè)模塊可以采用相對路徑導(dǎo)入包,不影響模塊功能一個(gè)腳本未成為模塊,即其目錄及父目錄內(nèi)無可以采用相對路徑導(dǎo)入包,并以腳本模式運(yùn)行。參考相對導(dǎo)入與絕對導(dǎo)入
絕對路徑導(dǎo)入格式為import a.b或者from a import b,相對路徑導(dǎo)入格式為from . import b或者from ..a import b。
python2默認(rèn)為相對路徑導(dǎo)入,python3默認(rèn)為絕對路徑導(dǎo)入。
為使python2,3通用,建議采用相對路徑導(dǎo)入from .a import b
一個(gè)目錄存在__init__.py文件,則該目錄成為一個(gè)包。
包中的一個(gè)模塊可以采用相對路徑導(dǎo)入包,不影響模塊功能;一個(gè)py腳本(未成為模塊,即其目錄及父目錄內(nèi)無__init__.py)可以采用相對路徑導(dǎo)入包,并以腳本模式運(yùn)行。但包含相對導(dǎo)入的模塊,不能直接以腳本模式運(yùn)行,常見報(bào)錯(cuò)為:
# 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
建立示例文件結(jié)構(gòu)如下:
注:以/結(jié)尾的為文件夾。
/home/zhkai/ mobike/ __init__.py utils.py data_process/ loc.py
注意此時(shí)mobike成為一個(gè)python包。
在loc.py中導(dǎo)入utils.py該怎么辦?
在loc.py中導(dǎo)入util的方法為:
import sys sys.path.append("/home/zhkai") from mobike.utils import read_csv
需要注意,這里導(dǎo)入系統(tǒng)路徑的是mobike所在目錄的路徑,路徑本身不包含mobike。
此時(shí)utils就像自帶的python包一樣,loc.py可直接運(yùn)行。
python的man page里有這個(gè)參數(shù):
-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包同級目錄下執(zhí)行:
? ~ python3 -m mobike.data_process.loc
注意:此時(shí)若loc.py代碼中有其他相對路徑,此時(shí)的相對路徑是基于shell命令所在位置,即~的,可能會造成錯(cuò)誤。import語句中的相對路徑,仍是基于文件所在位置,故不影響。
推薦這種方法,因?yàn)闊o需修改代碼文件。
還有句話不太理解:
如果一個(gè)模塊被直接運(yùn)行,則它自己為頂層模塊,不存在層次結(jié)構(gòu),所以找不到其他的相對路徑。
參考:
Python 相對導(dǎo)入與絕對導(dǎo)入
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40759.html
摘要:相對導(dǎo)入相對導(dǎo)入使用模塊的決定它是否在一個(gè)包內(nèi)。當(dāng)你是用類似進(jìn)行相對導(dǎo)入的時(shí)候,點(diǎn)表明在包的層次中上升多少。所以,你不能在交互式會話中直接使用任何相對導(dǎo)入。 源題目與答案地址如下http://stackoverflow.com/questions/14132...。下面是我的翻譯(看作機(jī)翻也行),以及原文。 這個(gè)問題是如何解決在相對導(dǎo)入的時(shí)候,如果出現(xiàn)System Error的時(shí)候的解...
摘要:比如,模塊名表示包中名為的子模塊。例如,文件可以包含以下代碼定義了之后,就會把,,導(dǎo)入到當(dāng)前命名空間。這種導(dǎo)入使用前導(dǎo)點(diǎn)來指示相對導(dǎo)入中涉及的當(dāng)前包和父包。也就是說被執(zhí)行的主程序里面不能包含相對導(dǎo)入。 包,Package,是一種Python模塊的集合,從文件組織形式上看,包就是一個(gè)文件夾,里面放著各種模塊(.py文件),也可以有子文件夾(子包)。包名構(gòu)建了一個(gè)Python模塊的命名空間...
摘要:模塊與包的導(dǎo)入一模塊導(dǎo)入定義模塊,是一個(gè)文件,以結(jié)尾,包含了對象定義和語句。使用模塊還可以避免函數(shù)名和變量名沖突。特別注意的是自定義的模塊名不應(yīng)該與系統(tǒng)內(nèi)置模塊重名。包是由一系列模塊組成的集合。模塊的導(dǎo)入使用語句。 【Python3】Python模塊與包的導(dǎo)入 一、模塊導(dǎo)入 1. 定義 Python 模塊(Module),是一個(gè) Python 文件,以 .py 結(jié)尾,包含了 Pytho...
摘要:所以,解決方案是強(qiáng)制要求從整個(gè)項(xiàng)目的頂層用來設(shè)置端正的路徑。這個(gè)做法是官方推薦的,也是合邏輯的,即一個(gè)完整的項(xiàng)目運(yùn)行就應(yīng)當(dāng)以項(xiàng)目為入口來運(yùn)行所有的子或子。經(jīng)過不斷的實(shí)踐,發(fā)現(xiàn)他們大都沒說清楚上下文,甚至沒有告訴完整的解決方案。 參考Python官方:Packages?參考:Python相對導(dǎo)入一處不解參考:使用相對路徑名導(dǎo)入包中子模塊 理解Package Python里,就像所有的.p...
摘要:入門細(xì)節(jié)相除后的類型雙斜杠是整除,出來的類型是。序列,集合和字典屬于組,是的基本數(shù)據(jù)類型。變量名區(qū)分大小寫。盡量避免循環(huán)引入。變量函數(shù)等引入內(nèi)指定的變量函數(shù)等。中如果沒有出現(xiàn)模塊名也是絕對導(dǎo)入。頂級包與入口文件的位置 python入門細(xì)節(jié) 相除后的類型 type(2/2) float type(2//2) int 雙斜杠是整除,出來的類型是int。單斜杠的出來的是float類型。 進(jìn)制...
閱讀 862·2021-11-25 09:43
閱讀 3692·2021-11-19 09:40
閱讀 897·2021-09-29 09:34
閱讀 1814·2021-09-26 10:21
閱讀 887·2021-09-22 15:24
閱讀 4207·2021-09-22 15:08
閱讀 3285·2021-09-07 09:58
閱讀 2709·2019-08-30 15:55