注意:这是Python 3.5
给定一些项目thing
,以便:
thing/
top.py (imports bar)
utils/
__init__.py (empty)
bar.py (imports foo; has some functions and variables)
foo.py (has some functions and variables)
我可以在 top.py 中import utils.bar
,在运行 top.py 时,文件 bar.py 必须包含{ {1}}获取 foo.py 的代码。
要直接运行 bar.py , bar.py 必须改为import utils.foo
(import foo
失败)。如果我进行了更改,则 top.py 将不再有效。
如何在两个用例中运行top.py或bar.py并在bar.py中仍使用相同的import构造?我觉得我错过了一些简单的步骤或构造,但也许期望bar.py以这种方式独立工作是要求太多(没有条件导入等)。
编辑:我已经接受了正确的答案,但是如果您仍坚持用一些扭曲做这件事,以下内容对我有用:
在 bar.py
中import utils.foo
然后你可以直接运行bar.py(在我的情况下,当我开发 bar.py 我在底部的try:
import foo
except ImportError as err:
from . import foo
块中使用一些实验代码时文件)。一旦我的代码很好地集成,我就删除条件和主部分(因为它并不意味着独立运行)。
答案 0 :(得分:2)
它通常具有模块外的所有入口点,而不是所有导入都可以是相对的。 例如
thing/
app.py
thing/
__init__.py
top.py
utils/
__init__.py
bar.py
foo.py
app.py看起来像
from thing import app
if __name__ == '__main__':
app.main()
比top.py好吗
from .utils import bar
在酒吧,你有
from . import foo
或
from thing.utils import foo
或者
from ..utils import foo
因此,如果您需要两个入口点,您可以让app
为第二个入口点获取命令行参数,或者您可以创建另一个像导入栏的应用程序文件
答案 1 :(得分:1)
https://docs.python.org/2.5/whatsnew/pep-328.html尝试使用import .foo,对于python 3,请参阅Relative imports in Python 3