【问题标题】:changing namespace of current python script (class with module name)更改当前 python 脚本的命名空间(具有模块名称的类)
【发布时间】:2013-01-24 19:43:22
【问题描述】:

我在以下目录结构中有一个 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

【问题讨论】:

  • 你试过import foo as bar吗?

标签: python import namespaces


【解决方案1】:

当前目录默认在路径上,所以你需要在导入另一个foo模块之前删除它:

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

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

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

【讨论】:

    【解决方案2】:

    如果只写import foo,肯定会加载当前作用域的foo模块。假设 lib 和 foo 作为包,你不需要写这样的东西来让它工作吗?

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

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2014-02-18
      相关资源
      最近更新 更多