在Python中导入模块作为包*的一部分*以及独立工作的方式

时间:2016-11-07 00:35:40

标签: python python-import python-3.5

注意:这是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.fooimport 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 块中使用一些实验代码时文件)。一旦我的代码很好地集成,我就删除条件和部分(因为它并不意味着独立运行)。

2 个答案:

答案 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