2012-12-12 58 views
0

從pth文件執行的導入語句似乎執行得很好。但我似乎無法訪問以此方式導入的任何模塊。python pth文件導入語句無效?

這是什麼魔法?

+3

什麼詛咒在這個危險的任務進一步冒險擋住啦? (或者,對於記錄:?什麼是錯誤的代碼是什麼您遇到的錯誤?) –

+0

@Samuele正如我所說的,在PTH文件導入的模塊不代碼變得可用。 – Ziffusion

+2

請詳細說明:「似乎無法訪問」。什麼是完整的追溯? '.pth'文件可能會改變你可以導入的模塊,但是可以訪問一個你需要明確地將它導入代碼的模塊。要影響什麼,'.pth'-文件應該由site.py認可目錄('site.getsitepackages()','site.getusersitepackages()','site.addsitedir()')。 – jfs

回答

3

從你的意見,我猜你得到NameError異常針對某些模塊由於有關.pth -files目的混淆。

pth代表path。目的是添加路徑到sys.path(pythonpath - Python用於在導入期間查找模塊的路徑)。請參閱site module documentation

import開頭的行可以包含任何代碼,但通常它們會修改sys.path。例如,setuptools機械:

import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) 

另一種常見的情況是當.pth -files用於實現"namespace" packages

import sys,types,os; p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('zope',)); ie = os.path.exists(os.path.join(p,'__init__.py')); m = not ie and sys.modules.setdefault('zope',types.ModuleType('zope')); mp = (m or []) and m.__dict__.setdefault('__path__',[]); (p not in mp) and mp.append(p) 

.pth -files是不是有做模塊名稱出現在你的代碼。要導入some_module,在每個模塊的頂部添加要使用它:

import some_module 
+0

這就是我想獲得一些洞察力。您可以通過將相應的行添加到第p個文件來添加到路徑中。那麼允許導入聲明的目的/想法是什麼?它打算解決什麼問題?它迎合了哪些用例? – Ziffusion

+1

@Ziffusion:我添加了用例'import'內'.pth'-文件 – jfs

+0

@Ziffusion它解決的問題是,你就可以使用該模塊中的代碼。 – Marcin