我正在尝试在开发环境中工作,但我发现问题在于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,为什么它找不到本地目录中的其他文件?
干杯
答案 0 :(得分:3)
您提到当前目录下有一个foo
目录,但您没有告诉我们foo/__init__.py
是否存在(甚至可能是空的):如果不存在,则告诉Python { {1}} 不一个包。同样适用于foo
- 如果该文件不存在,即使foo/bar/__init__.py
有,那么foo/__init__.py
也不是包。
您可以通过在包中明确放置foo.bar
个文件和/或设置.pth
来玩一下,但基本的简单规则是在每个目录中放置__path__
您希望Python将其识别为包。该文件的内容是包本身的“正文”,因此,如果__init__.py
和import 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吗?