关于python import的sys.path路径问题
關(guān)于python import的sys.path路徑問題
sys.path
先說一下 sys.path 這個變量,該變量需要導(dǎo)入 sys 官方庫方可使用,它是一個列表,是當(dāng)前 python 文件 import 庫時會逐個搜索列表中的路徑。
初始化
sys.path 從這些位置初始化:
- 包含輸入腳本的目錄(或當(dāng)前目錄,當(dāng)沒有指定文件時)
- PYTHONPATH(目錄名列表,與 shell 變量 PATH 語法相同)
- 與安裝相關(guān)的默認(rèn)值(比如當(dāng)前conda環(huán)境的路徑)
添加
為了解決上述問題,需要添加模塊搜索路徑,可以使用以下幾種方式:
-
動態(tài)增加路徑
臨時生效,對于不經(jīng)常使用的模塊,這通常是最好的方式,因為不必用所有次要模塊的路徑來污染 PYTHONPATH。
import sys sys.path.append('/home/song/mylib') -
修改 PYTHONPATH 變量
永久生效,對于在許多程序中都使用的模塊,可以采用這種方式。這將改變所有 Python 應(yīng)用的搜索路徑,因為啟動 Python 時,它會讀取這個變量,甚至不同版本的 Python 都會受影響。
export PYTHONPATH=$PYTHONPATH:/home/song/mylib直接命令行執(zhí)行則當(dāng)前終端生效,或添加到 ~/.bashrc 中并 source 永久生效。
-
增加 .pth 文件
永久生效,這是最簡單的、也是推薦的方式。Python 在遍歷已知的庫文件目錄過程中,如果遇到 .pth 文件,便會將其中的路徑加入到 sys.path 中,于是 .pth 中所指定的路徑就可以被 Python 運行環(huán)境找到了。
在 /usr/local/lib/python3.5/site-packages 下添加一個擴展名為 .pth 的配置文件(例如:extras.pth),內(nèi)容為要添加的路徑:/home/song/mylib 。
例子
考慮這樣一個目錄結(jié)構(gòu),他基本涵蓋我們 python 文件 import 自定義庫時的情況:
. ├── lib1.py ├── t1 │?? ├── lib0.py │?? └── test.py └── t2└── lib2.py我們的 test.py 想要 import lib0、1、2.py 三個庫文件,并且,我們要考慮在 test.py 的當(dāng)前目錄運行(python test.py) 或其父目錄運行(python t1/test.py)時,分別應(yīng)該怎么做呢?
導(dǎo)入lib0
當(dāng)前目錄運行
首先要明確,我們的 python 程序在考慮相對路徑時,考慮的是文件所在目錄的相對路徑,而不是工作目錄的路徑。所以我們直接導(dǎo)入即可:
import lib0父目錄運行
剛才提到這不受到工作目錄影響,所以同上。
導(dǎo)入lib1
當(dāng)前目錄運行
我們都知道,要導(dǎo)入上級目錄的文件,可以通過在 sys.path 中追加上級目錄 .. 來實現(xiàn)。另一個關(guān)鍵點就在這里,sys.path 中的相對路徑是相對工作目錄而言的,而不是相對文件所在目錄。因此我們在當(dāng)前目錄運行時:
import sys sys.append('..')import lib1運行:python test.py。
父目錄運行
注意這里就有所不同了,因為 sys.path 是相對工作目錄而言的,我們在父目錄運行程序,工作目錄變化了,因此應(yīng)該:
import sys sys.append('.')import lib1導(dǎo)入lib2
實際導(dǎo)入 lib2 就與導(dǎo)入 lib1 類似,只是多一級即可
當(dāng)前目錄運行
import sys sys.append('..')import t2.lib1父目錄運行
import sys sys.append('.')import t2.lib1Ref:
Python 模塊搜索路徑
總結(jié)
以上是生活随笔為你收集整理的关于python import的sys.path路径问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国国际航空公司的机长有住上海的吗
- 下一篇: 如何看南海四国在南海联合巡逻