Python模块搜索路径问题

时间:2009-10-06 04:06:19

标签: python search path module

我正在尝试在开发环境中工作,但我发现问题在于python似乎使用了site-packages目录中的模块。我希望它使用我的开发目录中的模块。

sys.path返回一堆dirs,像这样

['', '/usr/lib/python26.zip', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/site-packages' etc

这很好,它使用当前目录作为查找的第一个位置(至少这是我理解它的方式)。

好的,如果我在当前目录中创建一个名为command.py的文件,那么事情就像我期望的那样工作。

>>> import commands
>>> commands.__file__
   'commands.pyc'

然后我退出python shell,然后启动另一个。然后我这样做。

>>> import foo.bar.commands

现在,我期待它做的是从当前目录下载到./foo/bar/并从那里获取命令模块。我得到的是这个

>>> foo.bar.commands.__file__
    '/usr/lib/python2.6/site-packages/foo/bar/commands.pyc'

即使从我当前的目录中有一个./foo/bar/commands.py

使用imp.find_module()和imp.load_module()我可以正确加载本地模块。什么真的很有意思(虽然我真的不知道它意味着什么)是这个序列中打印出来的最后一行

>>> import foo.bar.commands
>>> foo.bar.commands.__file__
   '/usr/lib/python2.6/site-packages/foo/bar/commands.pyc'
>>> foo.bar.__file__
   '/usr/lib/python2.6/site-packages/foo/bar/__int__.pyc'
>>> foo.__file__
    './foo/__init__.pyc'

所以如果它能在本地目录中找到foo / init .pyc,为什么它找不到本地目录中的其他文件?

干杯

2 个答案:

答案 0 :(得分:3)

您提到当前目录下有一个foo目录,但您没有告诉我们foo/__init__.py是否存在(甚至可能是空的):如果不存在,则告诉Python { {1}} 一个包。同样适用于foo - 如果该文件不存在,即使foo/bar/__init__.py有,那么foo/__init__.py也不是包。

您可以通过在包中明确放置foo.bar个文件和/或设置.pth来玩一下,但基本的简单规则是在每个目录中放置__path__您希望Python将其识别为包。该文件的内容是包本身的“正文”,因此,如果__init__.pyimport foo是一个带有foo文件的目录,那么这就是您要导入的内容(在无论如何,当你第一次从包或其任何子包中导入任何东西时,包的主体都会执行。)

如果这不是问题,看起来像其他一些导入(或显式的sys.path操作)可能会弄乱你。使用foo/__init__.py标志运行python会使导入高度可见,这可能会有所帮助。另一个好方法是放置

-v

就在您认为导致行为错误之前,并检查sys.path,sys.modules(以及可能的其他高级结构,例如导入挂钩) - 是否已经定义了sys.modules ['foo'] , 例如?交互式地尝试标准库模块import pdb; pdb.set_trace() 中的函数,这些函数代表您定位模块的路径也可能具有指导意义。

答案 1 :(得分:0)

foo在/usr/lib/python2.6/site-packages中做什么? 听起来你在本地目录中创建了foo,但这不一定是你要导入的那个。

尝试删除site-packages中的foo / bar

确保您的目录结构如下所示

/foo/__init__.py  
    /bar/__init__.py
        /commands.py

另外,最好不要为自己的模块重用python标准库名称 - 你可以调用你的commands.py吗?