更改当前Python脚本的命名空间(类与模块名)
我有一个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
如果你只是写了 import foo,这样肯定会在当前的环境中加载 foo 模块。假设 lib 和 foo 是两个包,那你难道不需要写一些类似下面的代码才能让它正常工作吗?
import lib.foo.bar as foobar
klass = foobar.Klass()
2
当前目录默认是在路径里的,所以在你导入其他的 foo
模块之前,需要把它去掉:
import sys
sys.path = [dir for dir in sys.path if dir != '']
另外,你也可以把 lib
目录放在前面,这样它就会优先被使用:
import sys
sys.path = ['../lib'] + sys.path