从__init__.py在Python中导入文件

13 投票
3 回答
12746 浏览
提问于 2025-04-15 13:15

假设我有以下的结构:

app/
  __init__.py
  foo/
    a.py
    b.py
    c.py
    __init__.py

a.py、b.py 和 c.py 这几个文件里有一些共同的导入(比如 logging、os、re 等等)。我能不能从 __init__.py 文件里导入这三到四个共同的模块,这样我就不需要在每个文件里都导入它们了?

补充说明:我的目标是避免在每个文件里都导入 5-6 个模块,这和性能没有关系。

3 个回答

6

是的,但别这么做。真的,别这样做。不过如果你还是想知道怎么做,那大概是这样的:

import __init__

re = __init__.re
logging = __init__.logging
os = __init__.os

我之所以说别这么做,不仅因为这样做很乱也没什么意义,还因为你的包其实不应该这样使用__init__.py。这个文件是用来初始化包的代码。

14

你可以使用一个常见的文件,比如 include.py,来实现这个功能,但这样做不太符合推荐的做法,因为它涉及到通配符导入。我们来看一下以下的文件:

app/
    __init__.py
foo/
    a.py
    b.py
    c.py
    include.py <- put the includes here.
    __init__.py

现在,在 a.py 等文件中,你可以这样做:

from include import *

正如上面所说的,这种做法不推荐,因为通配符导入是不被鼓励的。

11

不,日志功能必须放在每个模块的命名空间里,所以你得以某种方式导入它们(除非你把logging当作函数参数传递,这样做就有点奇怪了,至少可以这么说)。

不过,模块其实只会被导入一次(然后放到abc的命名空间里),所以不用担心会占用太多内存之类的问题。

当然,你可以把它们放到一个单独的模块里,然后把这个模块导入到每个abc里,但这个单独的模块每次还是得导入。

撰写回答