python新增包路徑 python包相對匯入

2021-10-10 19:16:17 字數 1626 閱讀 9260

絕對路徑匯入格式為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

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路徑 Mac新增路徑到PATH

這是小白寫給小白看的,如有紕漏,歡迎大神指出。我曾經被各種path問題困擾很久,雖然網上教程一大堆,但是看完還是一臉懵逼。剛好今晚重置了mac,又遇上 not on path 的問題,在這裡我手把手教各位小白怎麼新增路徑到path。我的mac一開始pip是沒有安裝的,通過python get pip...

Python新增模組路徑

1 import sys 匯入sys模組23 tmp test 要用絕對路徑 5print sys.path 檢視模組路徑 ubuntu 第三方模組目錄名為 dist packages windows 和redhat 第三方模組目錄名為 site packages 2.1 建立test.py 檔案,...

python包 模組路徑

當python執行import語句時,它會在一些路徑中搜尋python模組和擴充套件模組。可以通過sys.path檢視這些路徑,比如 import sys sys.path usr lib python2.7 site packages demo nova hooks 5 py2.7.egg usr...