成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python包相對導(dǎo)入

crossoverJie / 2049人閱讀

摘要:包中的一個(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該怎么辦?

方法1:將mobike包導(dǎo)入系統(tǒng)路徑

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)行。

【推薦】方法2:修改運(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

相關(guān)文章

  • Python相對導(dǎo)入導(dǎo)致SystemError的解決方案(譯)

    摘要:相對導(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í)候的解...

    ethernet 評論0 收藏0
  • python基礎(chǔ)教程:,對,沒錯(cuò),絕對不是雙肩!

    摘要:比如,模塊名表示包中名為的子模塊。例如,文件可以包含以下代碼定義了之后,就會把,,導(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模塊的命名空間...

    wuyangnju 評論0 收藏0
  • Python3】Python模塊與導(dǎo)入

    摘要:模塊與包的導(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...

    CoyPan 評論0 收藏0
  • Python Package Import 之痛

    摘要:所以,解決方案是強(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...

    nihao 評論0 收藏0
  • Python入門細(xì)節(jié)

    摘要:入門細(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)制...

    microcosm1994 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<