有关__init__.py的一些问题

时间:2020-07-24 02:20:02

标签: python module

环境:python3.8

目录:

test\
    module1\
           __init__.py
           mod1.py
    module2\
           mod2.py
    main.py

1。我可以导入没有__init__.py的目录,为什么?

我想检查 init .py的工作原理,因此我将module1module2导入main.py

# test\main.py
from module1 import mod1
from module2 import mod2

在我的期望中,第2行应该发生错误,因为我没有在__init__.py中创建module2

但是它们都可以导入。

现在,我对__init__.py的工作原理感到困惑


2。我无法导入在__init__.py

中导入的那些程序包

我尝试通过以下方式在mod1.py中导入main.py

# test\main.py
import module1
module.mod1.mod1_print() # mod1_print() is a function which is defined in mod1.py

所以我将mod1.py导入test\module1\__init__.py中:

# test\module1\__init__.py
import mod1

但是当我执行main.py时,出现此错误:

D:\>"C:/Program Files/Python38/python.exe" d:/test/main.py
Traceback (most recent call last):
  File "d:/test/main.py", line 2, in <module>
    import module1
  File "d:\test\module1\__init__.py", line 1, in <module>
    import mod1
ModuleNotFoundError: No module named 'mod1'

我的问题是:

如果我要以mod_print()的形式导入module.mod1.mod1_print(),该怎么办?

2 个答案:

答案 0 :(得分:2)

Python 3.3+具有Implicit Namespace Packages,允许它创建没有__init__.py文件的软件包。

允许隐式名称空间包意味着可以完全放弃提供 init .py文件的要求,并且可以将受影响的部分安装到公共目录中,也可以根据需要将其拆分为多个目录。

答案 1 :(得分:1)

  1. 请参见https://stackoverflow.com/a/37140173/9822-python> = 3.3删除了对__init__.py的要求。
  2. 您可以在module1/__init__.py中尝试类似的操作:
import module1.mod1