2012-12-12 61 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