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