更改当前python脚本的命名空间(具有模块名称的类)

时间:2013-01-24 19:43:22

标签: python import namespaces

我在以下目录结构中有一个2.6 python脚本和库:

+ bin
\- foo.py
+ lib
\+ foo
 \- bar.py

我希望用户运行bin/foo.py来实例化lib/foo.py中的类。要实现这一点,在我的bin/foo.py脚本中,我有以下代码:

from __future__ import absolute_import
import foo
klass = foo.bar.Klass()

然而,这导致:

AttributeError: 'module' object has no attribute 'bar'

即它认为foo本身而不是图书馆foo - 将bin/foo.py重命名为bin/foo-script.py按预期工作。

有没有办法可以保留bin/foo.py脚本并导入lib/foo.py

2 个答案:

答案 0 :(得分:2)

默认情况下,当前目录位于路径上,因此您需要在导入其他foo模块之前将其删除:

import sys
sys.path = [dir for dir in sys.path if dir != '']

或者,在lib目录前添加优先级:

import sys
sys.path = ['../lib'] + sys.path

答案 1 :(得分:0)

如果您只编写import foo,它肯定会在当前范围内加载foo模块。假设lib和foo作为包,你不需要写这样的东西才能使它工作吗?

import lib.foo.bar as foobar
klass = foobar.Klass()