国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python包相對導入

crossoverJie / 2037人閱讀

摘要:包中的一個模塊可以采用相對路徑導入包,不影響模塊功能一個腳本未成為模塊,即其目錄及父目錄內無可以采用相對路徑導入包,并以腳本模式運行。參考相對導入與絕對導入

絕對路徑導入格式為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該怎么辦?

方法1:將mobike包導入系統路徑

loc.py中導入util的方法為:

import sys
sys.path.append("/home/zhkai")
from mobike.utils import read_csv 

需要注意,這里導入系統路徑的是mobike所在目錄的路徑,路徑本身不包含mobike。
此時utils就像自帶的python包一樣,loc.py可直接運行。

【推薦】方法2:修改運行命令

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

相關文章

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

    摘要:相對導入相對導入使用模塊的決定它是否在一個包內。當你是用類似進行相對導入的時候,點表明在包的層次中上升多少。所以,你不能在交互式會話中直接使用任何相對導入。 源題目與答案地址如下http://stackoverflow.com/questions/14132...。下面是我的翻譯(看作機翻也行),以及原文。 這個問題是如何解決在相對導入的時候,如果出現System Error的時候的解...

    ethernet 評論0 收藏0
  • python基礎教程:,對,沒錯,絕對不是雙肩

    摘要:比如,模塊名表示包中名為的子模塊。例如,文件可以包含以下代碼定義了之后,就會把,,導入到當前命名空間。這種導入使用前導點來指示相對導入中涉及的當前包和父包。也就是說被執行的主程序里面不能包含相對導入。 包,Package,是一種Python模塊的集合,從文件組織形式上看,包就是一個文件夾,里面放著各種模塊(.py文件),也可以有子文件夾(子包)。包名構建了一個Python模塊的命名空間...

    wuyangnju 評論0 收藏0
  • Python3】Python模塊與導入

    摘要:模塊與包的導入一模塊導入定義模塊,是一個文件,以結尾,包含了對象定義和語句。使用模塊還可以避免函數名和變量名沖突。特別注意的是自定義的模塊名不應該與系統內置模塊重名。包是由一系列模塊組成的集合。模塊的導入使用語句。 【Python3】Python模塊與包的導入 一、模塊導入 1. 定義 Python 模塊(Module),是一個 Python 文件,以 .py 結尾,包含了 Pytho...

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

    摘要:所以,解決方案是強制要求從整個項目的頂層用來設置端正的路徑。這個做法是官方推薦的,也是合邏輯的,即一個完整的項目運行就應當以項目為入口來運行所有的子或子。經過不斷的實踐,發現他們大都沒說清楚上下文,甚至沒有告訴完整的解決方案。 參考Python官方:Packages?參考:Python相對導入一處不解參考:使用相對路徑名導入包中子模塊 理解Package Python里,就像所有的.p...

    nihao 評論0 收藏0
  • Python入門細節

    摘要:入門細節相除后的類型雙斜杠是整除,出來的類型是。序列,集合和字典屬于組,是的基本數據類型。變量名區分大小寫。盡量避免循環引入。變量函數等引入內指定的變量函數等。中如果沒有出現模塊名也是絕對導入。頂級包與入口文件的位置 python入門細節 相除后的類型 type(2/2) float type(2//2) int 雙斜杠是整除,出來的類型是int。單斜杠的出來的是float類型。 進制...

    microcosm1994 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<