10.9 將文件夾加入到sys.path

2018-02-24 15:27 更新

問題

你無法導(dǎo)入你的Python代碼因?yàn)樗诘哪夸洸辉趕ys.path里。你想將添加新目錄到Python路徑,但是不想硬鏈接到你的代碼。

解決方案

有兩種常用的方式將新目錄添加到sys.path。第一種,你可以使用PYTHONPATH環(huán)境變量來添加。例如:

bash % env PYTHONPATH=/some/dir:/other/dir python3
Python 3.3.0 (default, Oct 4 2012, 10:17:33)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/some/dir', '/other/dir', ...]
>>>

在自定義應(yīng)用程序中,這樣的環(huán)境變量可在程序啟動(dòng)時(shí)設(shè)置或通過shell腳本。

第二種方法是創(chuàng)建一個(gè).pth文件,將目錄列舉出來,像這樣:

# myapplication.pth
/some/dir
/other/dir

這個(gè).pth文件需要放在某個(gè)Python的site-packages目錄,通常位于/usr/local/lib/python3.3/site-packages 或者 ~/.local/lib/python3.3/sitepackages。當(dāng)解釋器啟動(dòng)時(shí),.pth文件里列舉出來的存在于文件系統(tǒng)的目錄將被添加到sys.path。安裝一個(gè).pth文件可能需要管理員權(quán)限,如果它被添加到系統(tǒng)級(jí)的Python解釋器。

討論

比起費(fèi)力地找文件,你可能會(huì)傾向于寫一個(gè)代碼手動(dòng)調(diào)節(jié)sys.path的值。例如:

import sys
sys.path.insert(0, '/some/dir')
sys.path.insert(0, '/other/dir')

雖然這能“工作”,它是在實(shí)踐中極為脆弱,應(yīng)盡量避免使用。這種方法的問題是,它將目錄名硬編碼到了你的源。如果你的代碼被移到一個(gè)新的位置,這會(huì)導(dǎo)致維護(hù)問題。更好的做法是在不修改源代碼的情況下,將path配置到其他地方。如果您使用模塊級(jí)的變量來精心構(gòu)造一個(gè)適當(dāng)?shù)慕^對(duì)路徑,有時(shí)你可以解決硬編碼目錄的問題,比如file。舉個(gè)例子:

import sys
from os.path import abspath, join, dirname
sys.path.insert(0, abspath(dirname('__file__'), 'src'))

這將src目錄添加到path里,和執(zhí)行插入步驟的代碼在同一個(gè)目錄里。

site-packages目錄是第三方包和模塊安裝的目錄。如果你手動(dòng)安裝你的代碼,它將被安裝到site-packages目錄。雖然.pth文件配置的path必須出現(xiàn)在site-packages里,但代碼可以在系統(tǒng)上任何你想要的目錄。因此,你可以把你的代碼放在一系列不同的目錄,只要那些目錄包含在.pth文件里。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)