更改当前Python脚本的命名空间(类与模块名)

0 投票
2 回答
1272 浏览
提问于 2025-04-17 13:34

我有一个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

撰写回答